summaryrefslogtreecommitdiffstats
path: root/Source/cmStringAlgorithms.h
diff options
context:
space:
mode:
authorBrad King <brad.king@kitware.com>2024-01-17 14:56:00 (GMT)
committerBrad King <brad.king@kitware.com>2024-01-17 15:17:06 (GMT)
commitd9d9326e1438855efd5089f76943ce7b31d1f2ad (patch)
treed11a380a2e210f4bf9f6bc47742fc00e64ca555e /Source/cmStringAlgorithms.h
parent14abdc8e2b7d49cf74354894f3bd8cbf35b3bf85 (diff)
downloadCMake-d9d9326e1438855efd5089f76943ce7b31d1f2ad.zip
CMake-d9d9326e1438855efd5089f76943ce7b31d1f2ad.tar.gz
CMake-d9d9326e1438855efd5089f76943ce7b31d1f2ad.tar.bz2
Source: Avoid out-of-range inputs to std::isspace()
`isspace` takes `int` but documents that the value must be representable by `unsigned char`, or be EOF. Use a wrapper to cast to `unsigned char` to avoid sign extension while converting to `int`. This generalizes the fix from commit 5e8c176e2a (cmExecuteProcessCommand: Cast c to unsigned char before cast to int, 2024-01-05) to other `isspace` call sites. This was detected by assertions in the MSVC standard library while processing UTF-8 text. Issue: #25561
Diffstat (limited to 'Source/cmStringAlgorithms.h')
-rw-r--r--Source/cmStringAlgorithms.h5
1 files changed, 4 insertions, 1 deletions
diff --git a/Source/cmStringAlgorithms.h b/Source/cmStringAlgorithms.h
index 4a9840b..55a1e46 100644
--- a/Source/cmStringAlgorithms.h
+++ b/Source/cmStringAlgorithms.h
@@ -44,7 +44,10 @@ private:
/** Returns true if the character @a ch is a whitespace character. **/
inline bool cmIsSpace(char ch)
{
- return ((ch & 0x80) == 0) && std::isspace(ch);
+ // isspace takes 'int' but documents that the value must be representable
+ // by 'unsigned char', or be EOF. Cast to 'unsigned char' to avoid sign
+ // extension while converting to 'int'.
+ return std::isspace(static_cast<unsigned char>(ch));
}
/** Returns a string that has whitespace removed from the start and the end. */