]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
[3.12] gh-109098: Fuzz re module instead of internal sre (GH-109911) (#109932)
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Mon, 2 Oct 2023 15:39:07 +0000 (08:39 -0700)
committerGitHub <noreply@github.com>
Mon, 2 Oct 2023 15:39:07 +0000 (17:39 +0200)
gh-109098: Fuzz re module instead of internal sre (GH-109911)

* gh-109098: Fuzz re module instead of internal sre
* Fix c-analyzer globals test failure
* Put globals exception in ignored.tsv
(cherry picked from commit a829356f86d597e4dfe92e236a6d711c8a464f16)

Co-authored-by: Ammar Askar <ammar@ammaraskar.com>
Modules/_xxtestfuzz/fuzzer.c
Tools/c-analyzer/cpython/ignored.tsv

index 37d402824853f0b6733112c15fb9de4ad872e77b..cd97206d181d62e202e51ca5b665f36a3ea1111d 100644 (file)
@@ -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();
     }
 
@@ -526,13 +522,8 @@ int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
 #if !defined(_Py_FUZZ_ONE) || defined(_Py_FUZZ_fuzz_sre_compile)
     static int SRE_COMPILE_INITIALIZED = 0;
     if (!SRE_COMPILE_INITIALIZED && !init_sre_compile()) {
-        if (!PyErr_ExceptionMatches(PyExc_DeprecationWarning)) {
-            PyErr_Print();
-            abort();
-        }
-        else {
-            PyErr_Clear();
-        }
+        PyErr_Print();
+        abort();
     } else {
         SRE_COMPILE_INITIALIZED = 1;
     }
index 6a7c14ebb220a8d39057bb9bdd70401c4761588c..629a9a10ae59bbd74d49e70011625e2f302ab7da 100644 (file)
@@ -572,15 +572,15 @@ Modules/_testmultiphase.c -       uninitialized_def       -
 Modules/_testsinglephase.c     -       global_state    -
 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  -