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
This commit is contained in:
Brad King
2022-09-20 11:16:29 -04:00
parent 31f158e4c8
commit 8fc822e13a

View File

@@ -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