From 5e8c176e2ac38617b35eb9152ef76d949ef736e8 Mon Sep 17 00:00:00 2001 From: leha-bot Date: Fri, 5 Jan 2024 21:56:33 +0300 Subject: cmExecuteProcessCommand: Cast c to unsigned char before cast to int As the 'char' type may be either signed, or unsigned, there are some clashes between C Standard library functions and actual characters while casting it to int directly. In case the 'char' type was signed, the casted to int result value may be extended to full negative digit which may be out of range of isspace() function (e.g. , for MSVC implementation, which checks it for '> -1', and throwing an assertion failure on fail). Fixes: #25561 --- Source/cmExecuteProcessCommand.cxx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Source/cmExecuteProcessCommand.cxx b/Source/cmExecuteProcessCommand.cxx index e764545..483a601 100644 --- a/Source/cmExecuteProcessCommand.cxx +++ b/Source/cmExecuteProcessCommand.cxx @@ -35,7 +35,11 @@ namespace { bool cmExecuteProcessCommandIsWhitespace(char c) { - return (isspace(static_cast(c)) || c == '\n' || c == '\r'); + // isspace takes 'int' but documents that the value must be representable + // by 'unsigned char', or EOF. Cast to 'unsigned char' to avoid sign + // extension while casting to 'int'. + return (isspace(static_cast(static_cast(c))) || + c == '\n' || c == '\r'); } void cmExecuteProcessCommandFixText(std::vector& output, -- cgit v0.12