]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-110590: Fix a bug where _sre.compile would overwrite exceptions (#110591)
authorNikita Sobolev <mail@sobolevn.me>
Tue, 10 Oct 2023 10:15:12 +0000 (13:15 +0300)
committerGitHub <noreply@github.com>
Tue, 10 Oct 2023 10:15:12 +0000 (10:15 +0000)
TypeError would be overwritten by OverflowError
if 'code' param contained non-ints.

Lib/test/test_re.py
Misc/NEWS.d/next/Library/2023-10-10-10-46-55.gh-issue-110590.fatz-h.rst [new file with mode: 0644]
Modules/_sre/sre.c

index 45bce1925f9e89194b2930b44e18f4127d8eaf20..301d4a516568b21a5c8190760c3d5d3b289fcedf 100644 (file)
@@ -2735,6 +2735,9 @@ class ImplementationTest(unittest.TestCase):
             _sre.compile("abc", 0, [long_overflow], 0, {}, ())
         with self.assertRaises(TypeError):
             _sre.compile({}, 0, [], 0, [], [])
+        # gh-110590: `TypeError` was overwritten with `OverflowError`:
+        with self.assertRaises(TypeError):
+            _sre.compile('', 0, ['abc'], 0, {}, ())
 
     @cpython_only
     def test_repeat_minmax_overflow_maxrepeat(self):
diff --git a/Misc/NEWS.d/next/Library/2023-10-10-10-46-55.gh-issue-110590.fatz-h.rst b/Misc/NEWS.d/next/Library/2023-10-10-10-46-55.gh-issue-110590.fatz-h.rst
new file mode 100644 (file)
index 0000000..20dc3ff
--- /dev/null
@@ -0,0 +1,3 @@
+Fix a bug in :meth:`!_sre.compile` where :exc:`TypeError`
+would be overwritten by :exc:`OverflowError` when
+the *code* argument was a list of non-ints.
index 07da5da13f70d3981ce81c19772dd39a50e401d2..798732ccddc99aa45e6d9fa868a19f6dcd3b9a81 100644 (file)
@@ -1508,6 +1508,9 @@ _sre_compile_impl(PyObject *module, PyObject *pattern, int flags,
     for (i = 0; i < n; i++) {
         PyObject *o = PyList_GET_ITEM(code, i);
         unsigned long value = PyLong_AsUnsignedLong(o);
+        if (value == (unsigned long)-1 && PyErr_Occurred()) {
+            break;
+        }
         self->code[i] = (SRE_CODE) value;
         if ((unsigned long) self->code[i] != value) {
             PyErr_SetString(PyExc_OverflowError,