diff options
author | Brad King <brad.king@kitware.com> | 2024-01-17 14:56:00 (GMT) |
---|---|---|
committer | Brad King <brad.king@kitware.com> | 2024-01-17 15:17:06 (GMT) |
commit | d9d9326e1438855efd5089f76943ce7b31d1f2ad (patch) | |
tree | d11a380a2e210f4bf9f6bc47742fc00e64ca555e /Source/cmExecuteProcessCommand.cxx | |
parent | 14abdc8e2b7d49cf74354894f3bd8cbf35b3bf85 (diff) | |
download | CMake-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/cmExecuteProcessCommand.cxx')
-rw-r--r-- | Source/cmExecuteProcessCommand.cxx | 7 |
1 files changed, 1 insertions, 6 deletions
diff --git a/Source/cmExecuteProcessCommand.cxx b/Source/cmExecuteProcessCommand.cxx index 483a601..da6def9 100644 --- a/Source/cmExecuteProcessCommand.cxx +++ b/Source/cmExecuteProcessCommand.cxx @@ -2,7 +2,6 @@ file Copyright.txt or https://cmake.org/licensing for details. */ #include "cmExecuteProcessCommand.h" -#include <cctype> /* isspace */ #include <cstdint> #include <cstdio> #include <iostream> @@ -35,11 +34,7 @@ namespace { bool cmExecuteProcessCommandIsWhitespace(char c) { - // 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<int>(static_cast<unsigned char>(c))) || - c == '\n' || c == '\r'); + return (cmIsSpace(c) || c == '\n' || c == '\r'); } void cmExecuteProcessCommandFixText(std::vector<char>& output, |