mirror of https://github.com/python/cpython.git
[3.11] gh-109098: Fuzz re module instead of internal sre (GH-109911) (GH-109933)
* Fix c-analyzer globals test failure
* Put globals exception in ignored.tsv
(cherry picked from commit a829356f86
)
Co-authored-by: Ammar Askar <ammar@ammaraskar.com>
This commit is contained in:
parent
c485715ba8
commit
8ed9bda519
|
@ -188,37 +188,33 @@ static int fuzz_json_loads(const char* data, size_t size) {
|
|||
|
||||
#define MAX_RE_TEST_SIZE 0x10000
|
||||
|
||||
PyObject* sre_compile_method = NULL;
|
||||
PyObject* sre_error_exception = NULL;
|
||||
int SRE_FLAG_DEBUG = 0;
|
||||
PyObject* re_compile_method = NULL;
|
||||
PyObject* re_error_exception = NULL;
|
||||
int RE_FLAG_DEBUG = 0;
|
||||
/* Called by LLVMFuzzerTestOneInput for initialization */
|
||||
static int init_sre_compile(void) {
|
||||
/* Import sre_compile.compile and sre.error */
|
||||
PyObject* sre_compile_module = PyImport_ImportModule("sre_compile");
|
||||
if (sre_compile_module == NULL) {
|
||||
PyObject* re_module = PyImport_ImportModule("re");
|
||||
if (re_module == NULL) {
|
||||
return 0;
|
||||
}
|
||||
sre_compile_method = PyObject_GetAttrString(sre_compile_module, "compile");
|
||||
if (sre_compile_method == NULL) {
|
||||
re_compile_method = PyObject_GetAttrString(re_module, "compile");
|
||||
if (re_compile_method == NULL) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
PyObject* sre_constants = PyImport_ImportModule("sre_constants");
|
||||
if (sre_constants == NULL) {
|
||||
re_error_exception = PyObject_GetAttrString(re_module, "error");
|
||||
if (re_error_exception == NULL) {
|
||||
return 0;
|
||||
}
|
||||
sre_error_exception = PyObject_GetAttrString(sre_constants, "error");
|
||||
if (sre_error_exception == NULL) {
|
||||
return 0;
|
||||
}
|
||||
PyObject* debug_flag = PyObject_GetAttrString(sre_constants, "SRE_FLAG_DEBUG");
|
||||
PyObject* debug_flag = PyObject_GetAttrString(re_module, "DEBUG");
|
||||
if (debug_flag == NULL) {
|
||||
return 0;
|
||||
}
|
||||
SRE_FLAG_DEBUG = PyLong_AsLong(debug_flag);
|
||||
RE_FLAG_DEBUG = PyLong_AsLong(debug_flag);
|
||||
return 1;
|
||||
}
|
||||
/* Fuzz _sre.compile(x) */
|
||||
/* Fuzz re.compile(x) */
|
||||
static int fuzz_sre_compile(const char* data, size_t size) {
|
||||
/* Ignore really long regex patterns that will timeout the fuzzer */
|
||||
if (size > MAX_RE_TEST_SIZE) {
|
||||
|
@ -231,7 +227,7 @@ static int fuzz_sre_compile(const char* data, size_t size) {
|
|||
uint16_t flags = ((uint16_t*) data)[0];
|
||||
/* We remove the SRE_FLAG_DEBUG if present. This is because it
|
||||
prints to stdout which greatly decreases fuzzing speed */
|
||||
flags &= ~SRE_FLAG_DEBUG;
|
||||
flags &= ~RE_FLAG_DEBUG;
|
||||
|
||||
/* Pull the pattern from the remaining bytes */
|
||||
PyObject* pattern_bytes = PyBytes_FromStringAndSize(data + 2, size - 2);
|
||||
|
@ -244,9 +240,9 @@ static int fuzz_sre_compile(const char* data, size_t size) {
|
|||
return 0;
|
||||
}
|
||||
|
||||
/* compiled = _sre.compile(data[2:], data[0:2] */
|
||||
/* compiled = re.compile(data[2:], data[0:2] */
|
||||
PyObject* compiled = PyObject_CallFunctionObjArgs(
|
||||
sre_compile_method, pattern_bytes, flags_obj, NULL);
|
||||
re_compile_method, pattern_bytes, flags_obj, NULL);
|
||||
/* Ignore ValueError as the fuzzer will more than likely
|
||||
generate some invalid combination of flags */
|
||||
if (compiled == NULL && PyErr_ExceptionMatches(PyExc_ValueError)) {
|
||||
|
@ -262,7 +258,7 @@ static int fuzz_sre_compile(const char* data, size_t size) {
|
|||
PyErr_Clear();
|
||||
}
|
||||
/* Ignore re.error */
|
||||
if (compiled == NULL && PyErr_ExceptionMatches(sre_error_exception)) {
|
||||
if (compiled == NULL && PyErr_ExceptionMatches(re_error_exception)) {
|
||||
PyErr_Clear();
|
||||
}
|
||||
|
||||
|
|
|
@ -243,15 +243,15 @@ Modules/_testmultiphase.c - testexport_methods -
|
|||
Modules/_testmultiphase.c - uninitialized_def -
|
||||
Modules/_xxtestfuzz/_xxtestfuzz.c - _fuzzmodule -
|
||||
Modules/_xxtestfuzz/_xxtestfuzz.c - module_methods -
|
||||
Modules/_xxtestfuzz/fuzzer.c - SRE_FLAG_DEBUG -
|
||||
Modules/_xxtestfuzz/fuzzer.c - RE_FLAG_DEBUG -
|
||||
Modules/_xxtestfuzz/fuzzer.c - ast_literal_eval_method -
|
||||
Modules/_xxtestfuzz/fuzzer.c - compiled_patterns -
|
||||
Modules/_xxtestfuzz/fuzzer.c - csv_error -
|
||||
Modules/_xxtestfuzz/fuzzer.c - csv_module -
|
||||
Modules/_xxtestfuzz/fuzzer.c - json_loads_method -
|
||||
Modules/_xxtestfuzz/fuzzer.c - regex_patterns -
|
||||
Modules/_xxtestfuzz/fuzzer.c - sre_compile_method -
|
||||
Modules/_xxtestfuzz/fuzzer.c - sre_error_exception -
|
||||
Modules/_xxtestfuzz/fuzzer.c - re_compile_method -
|
||||
Modules/_xxtestfuzz/fuzzer.c - re_error_exception -
|
||||
Modules/_xxtestfuzz/fuzzer.c - struct_error -
|
||||
Modules/_xxtestfuzz/fuzzer.c - struct_unpack_method -
|
||||
Modules/_xxtestfuzz/fuzzer.c LLVMFuzzerTestOneInput CSV_READER_INITIALIZED -
|
||||
|
|
Can't render this file because it has a wrong number of fields in line 4.
|
Loading…
Reference in New Issue