diff --git a/Source/cmHexFileConverter.cxx b/Source/cmHexFileConverter.cxx index 3036473e01..2202a838ed 100644 --- a/Source/cmHexFileConverter.cxx +++ b/Source/cmHexFileConverter.cxx @@ -45,6 +45,10 @@ static bool OutputBin(FILE* file, char const* buf, unsigned int startIndex, success = false; break; } + if (outBufCount >= sizeof(outBuf)) { + success = false; + break; + } outBuf[outBufCount] = static_cast(convertedByte & 0xff); outBufCount++; } diff --git a/Tests/StringFileTest/CMakeLists.txt b/Tests/StringFileTest/CMakeLists.txt index f72dafd788..3c9570d9f4 100644 --- a/Tests/StringFileTest/CMakeLists.txt +++ b/Tests/StringFileTest/CMakeLists.txt @@ -55,6 +55,10 @@ else() "file(STRINGS) incorrectly read from srec file [${infile_strings}]") endif() +# this file is crafted to contain the maximum line length and trigger a buffer +# overflow +file(STRINGS "${CMAKE_CURRENT_SOURCE_DIR}/s1-max-length.srec" infile_strings) + #this file has utf-8 content file(STRINGS test.utf8 infile_strings ENCODING UTF-8) list(LENGTH infile_strings content_len) diff --git a/Tests/StringFileTest/s1-max-length.srec b/Tests/StringFileTest/s1-max-length.srec new file mode 100644 index 0000000000..e7dcee3cce --- /dev/null +++ b/Tests/StringFileTest/s1-max-length.srec @@ -0,0 +1,2 @@ +S107000001020304EE +S1FF000041414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414100