]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Fix `fuzz_builtin_int` fuzzer reproducibility (#145890)
authorStan Ulbrych <89152624+StanFromIreland@users.noreply.github.com>
Sat, 14 Mar 2026 18:11:29 +0000 (18:11 +0000)
committerGitHub <noreply@github.com>
Sat, 14 Mar 2026 18:11:29 +0000 (11:11 -0700)
Modules/_xxtestfuzz/fuzzer.c

index 6cb11562476e40666ad9e50440f7d1c4db9f3041..02afb01d3731fbc721f97e8566529a1b6781dc47 100644 (file)
@@ -38,23 +38,18 @@ static int fuzz_builtin_float(const char* data, size_t size) {
 static int fuzz_builtin_int(const char* data, size_t size) {
     /* Ignore test cases with very long ints to avoid timeouts
        int("9" * 1000000) is not a very interesting test caase */
-    if (size > MAX_INT_TEST_SIZE) {
+    if (size < 1 || size > MAX_INT_TEST_SIZE) {
         return 0;
     }
-    /* Pick a random valid base. (When the fuzzed function takes extra
-       parameters, it's somewhat normal to hash the input to generate those
-       parameters. We want to exercise all code paths, so we do so here.) */
-    int base = Py_HashBuffer(data, size) % 37;
+    // Use the first byte to pick a base
+    int base = ((unsigned char) data[0]) % 37;
     if (base == 1) {
         // 1 is the only number between 0 and 36 that is not a valid base.
         base = 0;
     }
-    if (base == -1) {
-        return 0;  // An error occurred, bail early.
-    }
-    if (base < 0) {
-        base = -base;
-    }
+
+    data += 1;
+    size -= 1;
 
     PyObject* s = PyUnicode_FromStringAndSize(data, size);
     if (s == NULL) {