浏览代码

file: Avoid strange istringstream crash in cmake.org binaries on Alpine Linux

Somehow using `istringstream` and `operator >>` to parse an integer
crashes on Alpine Linux, at least when compiled with the settings we use
for the official `cmake.org` Linux binaries.  Since commit fd0c285b12
(file: Fix types of the OFFSET and LIMIT arguments, 2022-01-04,
v3.23.0-rc1~133^2), this causes the `file(READ)` command to crash when
parsing its `LIMIT` or `OFFSET` argument.  Parse the input string with
our dedicated helper to avoid the crash.

Fixes: #23872
Brad King 3 年之前
父节点
当前提交
8fc822e13a
共有 1 个文件被更改,包括 8 次插入2 次删除
  1. 8 2
      Source/cmFileCommand.cxx

+ 8 - 2
Source/cmFileCommand.cxx

@@ -199,13 +199,19 @@ bool HandleReadCommand(std::vector<std::string> const& args,
   // is there a limit?
   std::string::size_type sizeLimit = std::string::npos;
   if (!arguments.Limit.empty()) {
-    std::istringstream(arguments.Limit) >> sizeLimit;
+    unsigned long long limit;
+    if (cmStrToULongLong(arguments.Limit, &limit)) {
+      sizeLimit = static_cast<std::string::size_type>(limit);
+    }
   }
 
   // is there an offset?
   cmsys::ifstream::off_type offset = 0;
   if (!arguments.Offset.empty()) {
-    std::istringstream(arguments.Offset) >> offset;
+    long long off;
+    if (cmStrToLongLong(arguments.Offset, &off)) {
+      offset = static_cast<cmsys::ifstream::off_type>(off);
+    }
   }
 
   file.seekg(offset, std::ios::beg); // explicit ios::beg for IBM VisualAge 6