Skip to content

Commit

Permalink
When the Py_CompileStringExFlags fuzzer encounters a SystemError, abo…
Browse files Browse the repository at this point in the history
…rt (python#115147)

This allows us to catch bugs beyond memory corruption and assertions.
  • Loading branch information
alex authored Feb 7, 2024
1 parent 8f0998e commit 38b970d
Showing 1 changed file with 9 additions and 2 deletions.
11 changes: 9 additions & 2 deletions Modules/_xxtestfuzz/fuzzer.c
Original file line number Diff line number Diff line change
Expand Up @@ -502,7 +502,6 @@ static int fuzz_elementtree_parsewhole(const char* data, size_t size) {
}

#define MAX_PYCOMPILE_TEST_SIZE 16384
static char pycompile_scratch[MAX_PYCOMPILE_TEST_SIZE];

static const int start_vals[] = {Py_eval_input, Py_single_input, Py_file_input};
const size_t NUM_START_VALS = sizeof(start_vals) / sizeof(start_vals[0]);
Expand Down Expand Up @@ -531,6 +530,8 @@ static int fuzz_pycompile(const char* data, size_t size) {
unsigned char optimize_idx = (unsigned char) data[1];
int optimize = optimize_vals[optimize_idx % NUM_OPTIMIZE_VALS];

char pycompile_scratch[MAX_PYCOMPILE_TEST_SIZE];

// Create a NUL-terminated C string from the remaining input
memcpy(pycompile_scratch, data + 2, size - 2);
// Put a NUL terminator just after the copied data. (Space was reserved already.)
Expand All @@ -549,7 +550,13 @@ static int fuzz_pycompile(const char* data, size_t size) {

PyObject *result = Py_CompileStringExFlags(pycompile_scratch, "<fuzz input>", start, flags, optimize);
if (result == NULL) {
/* compilation failed, most likely from a syntax error */
/* Compilation failed, most likely from a syntax error. If it was a
SystemError we abort. There's no non-bug reason to raise a
SystemError. */
if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_SystemError)) {
PyErr_Print();
abort();
}
PyErr_Clear();
} else {
Py_DECREF(result);
Expand Down

0 comments on commit 38b970d

Please sign in to comment.