diff --git a/Lib/test/datetimetester.py b/Lib/test/datetimetester.py index 2350125f6d..5c9bbee643 100644 --- a/Lib/test/datetimetester.py +++ b/Lib/test/datetimetester.py @@ -711,6 +711,15 @@ class TestTimeDelta(HarmlessMixedComparison, unittest.TestCase): self.assertRaises(OverflowError, day.__truediv__, 1e-10) self.assertRaises(OverflowError, day.__truediv__, 9e-10) + # test overflow in timedelta constructor + self.assertRaises(OverflowError, timedelta, -1 << 1000) + self.assertRaises(OverflowError, timedelta, -999999999, 0, -1) + # no tests here for getting timedelta.min and timedelta.max from + # timedelta constructor, as these are already tested in + # test_resolution_info. + self.assertRaises(OverflowError, timedelta, 1e9) + self.assertRaises(OverflowError, timedelta, 1 << 1000) + @support.requires_IEEE_754 def _test_overflow_special(self): day = timedelta(1) diff --git a/Lib/test/test_re.py b/Lib/test/test_re.py index 1d7fb76c38..f8d16c266e 100644 --- a/Lib/test/test_re.py +++ b/Lib/test/test_re.py @@ -1507,6 +1507,27 @@ class ReTests(unittest.TestCase): with self.assertRaises(TypeError): _sre.compile({}, 0, [], 0, [], []) + @cpython_only + def test_sre_compile_c_limits(self): + import _sre + # Currently SRE_CODE is an alias for Py_UCS4, which is an + # alias for uint32_t. + + with self.assertRaises(OverflowError): + _sre.compile("abc", 0, [-1 << 1000], 0, {}, tuple()) + with self.assertRaises(OverflowError): + _sre.compile("abc", 0, [-1], 0, {}, tuple()) + # verify OverflowError is not raised + with self.assertRaises(RuntimeError): + _sre.compile("abc", 0, [0], 0, {}, tuple()) + with self.assertRaises(RuntimeError): + _sre.compile("abc", 0, [(1 << 32) - 1], 0, {}, tuple()) + + with self.assertRaises(OverflowError): + _sre.compile("abc", 0, [1 << 32], 0, {}, tuple()) + with self.assertRaises(OverflowError): + _sre.compile("abc", 0, [1 << 1000], 0, {}, tuple()) + def test_search_dot_unicode(self): self.assertTrue(re.search("123.*-", '123abc-')) self.assertTrue(re.search("123.*-", '123\xe9-')) diff --git a/Modules/_datetimemodule.c b/Modules/_datetimemodule.c index 1803d85a71..8977b9fd67 100644 --- a/Modules/_datetimemodule.c +++ b/Modules/_datetimemodule.c @@ -1616,13 +1616,10 @@ microseconds_to_delta_ex(PyObject *pyus, PyTypeObject *type) if (num == NULL) goto Done; Py_INCREF(num); - temp = PyLong_AsLong(num); - if (temp == -1 && PyErr_Occurred()) - goto Done; - d = (int)temp; - if ((long)d != temp) { - PyErr_SetString(PyExc_OverflowError, "normalized days too " - "large to fit in a C int"); + d = _PyLong_AsInt(num); + if (d == -1 && PyErr_Occurred()) { + PyErr_SetString(PyExc_OverflowError, + "normalized days does not fit in C int"); goto Done; } result = new_delta_ex(d, s, us, 0, type); @@ -2531,7 +2528,7 @@ date_new(PyTypeObject *type, PyObject *args, PyObject *kw) return (PyObject *)me; } - if (PyArg_ParseTupleAndKeywords(args, kw, "iii", date_kws, + if (PyArg_ParseTupleAndKeywords(args, kw, "iii:date", date_kws, &year, &month, &day)) { self = new_date_ex(year, month, day, type); } @@ -3615,7 +3612,8 @@ time_new(PyTypeObject *type, PyObject *args, PyObject *kw) return (PyObject *)me; } - if (PyArg_ParseTupleAndKeywords(args, kw, "|iiiiO$i", time_kws, + if (PyArg_ParseTupleAndKeywords(args, kw, "|iiiiO$i:time", + time_kws, &hour, &minute, &second, &usecond, &tzinfo, &fold)) { self = new_time_ex2(hour, minute, second, usecond, tzinfo, fold, @@ -4201,7 +4199,8 @@ datetime_new(PyTypeObject *type, PyObject *args, PyObject *kw) return (PyObject *)me; } - if (PyArg_ParseTupleAndKeywords(args, kw, "iii|iiiiO$i", datetime_kws, + if (PyArg_ParseTupleAndKeywords(args, kw, "iii|iiiiO$i:datetime", + datetime_kws, &year, &month, &day, &hour, &minute, &second, &usecond, &tzinfo, &fold)) { self = new_datetime_ex2(year, month, day, diff --git a/Modules/_sre.c b/Modules/_sre.c index 2a2fd272c4..1202593f83 100644 --- a/Modules/_sre.c +++ b/Modules/_sre.c @@ -1413,13 +1413,16 @@ _sre_compile_impl(PyObject *module, PyObject *pattern, int flags, unsigned long value = PyLong_AsUnsignedLong(o); self->code[i] = (SRE_CODE) value; if ((unsigned long) self->code[i] != value) { - PyErr_SetString(PyExc_OverflowError, - "regular expression code size limit exceeded"); - break; + goto error; } } if (PyErr_Occurred()) { + if (PyErr_ExceptionMatches(PyExc_OverflowError)) { +error: + PyErr_SetString(PyExc_OverflowError, + "regular expression code out of range"); + } Py_DECREF(self); return NULL; } diff --git a/Modules/timemodule.c b/Modules/timemodule.c index 25eb92dada..71d39d614f 100644 --- a/Modules/timemodule.c +++ b/Modules/timemodule.c @@ -415,7 +415,7 @@ When 'seconds' is not passed in, convert the current time instead."); * an exception and return 0 on error. */ static int -gettmarg(PyObject *args, struct tm *p) +gettmarg(PyObject *args, struct tm *p, const char *format) { int y; @@ -427,11 +427,12 @@ gettmarg(PyObject *args, struct tm *p) return 0; } - if (!PyArg_ParseTuple(args, "iiiiiiiii", + if (!PyArg_ParseTuple(args, format, &y, &p->tm_mon, &p->tm_mday, &p->tm_hour, &p->tm_min, &p->tm_sec, - &p->tm_wday, &p->tm_yday, &p->tm_isdst)) + &p->tm_wday, &p->tm_yday, &p->tm_isdst)) { return 0; + } p->tm_year = y - 1900; p->tm_mon--; p->tm_wday = (p->tm_wday + 1) % 7; @@ -586,7 +587,7 @@ time_strftime(PyObject *self, PyObject *args) if (_PyTime_localtime(tt, &buf) != 0) return NULL; } - else if (!gettmarg(tup, &buf) || !checktm(&buf)) + else if (!gettmarg(tup, &buf, "iiiiiiiii:strftime") || !checktm(&buf)) return NULL; #if defined(_MSC_VER) || defined(sun) || defined(_AIX) @@ -777,7 +778,7 @@ time_asctime(PyObject *self, PyObject *args) if (_PyTime_localtime(tt, &buf) != 0) return NULL; - } else if (!gettmarg(tup, &buf) || !checktm(&buf)) + } else if (!gettmarg(tup, &buf, "iiiiiiiii:asctime") || !checktm(&buf)) return NULL; return _asctime(&buf); } @@ -814,7 +815,7 @@ time_mktime(PyObject *self, PyObject *tup) { struct tm buf; time_t tt; - if (!gettmarg(tup, &buf)) + if (!gettmarg(tup, &buf, "iiiiiiiii:mktime")) return NULL; #ifdef _AIX /* year < 1902 or year > 2037 */ @@ -822,7 +823,7 @@ time_mktime(PyObject *self, PyObject *tup) /* Issue #19748: On AIX, mktime() doesn't report overflow error for * timestamp < -2^31 or timestamp > 2**31-1. */ PyErr_SetString(PyExc_OverflowError, - "mktime argument out of range"); + "mktime() argument out of range"); return NULL; } #else @@ -842,7 +843,7 @@ time_mktime(PyObject *self, PyObject *tup) ) { PyErr_SetString(PyExc_OverflowError, - "mktime argument out of range"); + "mktime() argument out of range"); return NULL; } return PyFloat_FromDouble((double)tt);