summaryrefslogtreecommitdiffstats
path: root/Source/cmFileCommand.cxx
diff options
context:
space:
mode:
authorBrad King <brad.king@kitware.com>2022-09-20 15:16:29 (GMT)
committerBrad King <brad.king@kitware.com>2022-09-20 16:00:08 (GMT)
commit8fc822e13a8bf8695e475655f647d5d69f99c414 (patch)
tree97829920132f02dad0a2c92d40b5cceda421d2e7 /Source/cmFileCommand.cxx
parent31f158e4c881bea2b526102b2024b0fb34ade42d (diff)
downloadCMake-8fc822e13a8bf8695e475655f647d5d69f99c414.zip
CMake-8fc822e13a8bf8695e475655f647d5d69f99c414.tar.gz
CMake-8fc822e13a8bf8695e475655f647d5d69f99c414.tar.bz2
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
Diffstat (limited to 'Source/cmFileCommand.cxx')
-rw-r--r--Source/cmFileCommand.cxx10
1 files changed, 8 insertions, 2 deletions
diff --git a/Source/cmFileCommand.cxx b/Source/cmFileCommand.cxx
index da2f15f..fb15a1b 100644
--- a/Source/cmFileCommand.cxx
+++ b/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