1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
|
/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
file LICENSE.rst or https://cmake.org/licensing for details. */
/*
* Fuzzer for CMake's ListFile lexer (CMakeLists.txt parser)
*
* This fuzzer targets cmListFileLexer which tokenizes CMakeLists.txt files.
* It's a critical attack surface as malicious CMakeLists.txt files could be
* encountered when building untrusted projects.
*
* Coverage targets:
* - Token parsing (identifiers, strings, brackets, comments)
* - BOM handling (UTF-8, UTF-16, UTF-32)
* - Bracket argument/comment parsing
* - Error recovery for malformed input
*/
#include <cstddef>
#include <cstdint>
#include "cmListFileLexer.h"
// Limit input size to avoid timeouts on complex inputs
static constexpr size_t kMaxInputSize = 64 * 1024; // 64KB
extern "C" int LLVMFuzzerTestOneInput(uint8_t const* data, size_t size)
{
// Skip overly large inputs
if (size == 0 || size > kMaxInputSize) {
return 0;
}
cmListFileLexer* lexer = cmListFileLexer_New();
if (!lexer) {
return 0;
}
// Parse from string (not file) for efficiency
if (cmListFileLexer_SetString(lexer, reinterpret_cast<char const*>(data),
size)) {
// Consume all tokens until EOF or error
cmListFileLexer_Token* token;
while ((token = cmListFileLexer_Scan(lexer)) != nullptr) {
// Access token fields to ensure they're valid
(void)token->type;
(void)token->text;
(void)token->length;
(void)token->line;
(void)token->column;
// Get type as string for additional coverage
(void)cmListFileLexer_GetTypeAsString(lexer, token->type);
}
// Exercise position tracking
(void)cmListFileLexer_GetCurrentLine(lexer);
(void)cmListFileLexer_GetCurrentColumn(lexer);
}
cmListFileLexer_Delete(lexer);
return 0;
}
|