mirror of
https://gitlab.kitware.com/cmake/cmake.git
synced 2026-09-25 04:09:36 +03:00
Fuzz the CMake listfile lexer (cmListFileLexer) with generated inputs. Tests tokenization of CMakeLists.txt files.
63 lines
1.8 KiB
C++
63 lines
1.8 KiB
C++
/* 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;
|
|
}
|