summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Lib/test/test_re.py3
-rw-r--r--Misc/NEWS.d/next/Library/2023-10-10-10-46-55.gh-issue-110590.fatz-h.rst3
-rw-r--r--Modules/_sre/sre.c3
3 files changed, 9 insertions, 0 deletions
diff --git a/Lib/test/test_re.py b/Lib/test/test_re.py
index 45bce19..301d4a5 100644
--- a/Lib/test/test_re.py
+++ b/Lib/test/test_re.py
@@ -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
index 0000000..20dc3ff
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2023-10-10-10-46-55.gh-issue-110590.fatz-h.rst
@@ -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.
diff --git a/Modules/_sre/sre.c b/Modules/_sre/sre.c
index 07da5da..798732c 100644
--- a/Modules/_sre/sre.c
+++ b/Modules/_sre/sre.c
@@ -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,