From: Lysandros Nikolaou Date: Thu, 12 Oct 2023 09:34:12 +0000 (+0200) Subject: gh-107450: Raise OverflowError when parser column offset overflows (#110754) X-Git-Tag: v3.13.0a1~19 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=fb7843ee895ac7f6eeb58f356b1a320eea081cfc;p=thirdparty%2FPython%2Fcpython.git gh-107450: Raise OverflowError when parser column offset overflows (#110754) --- diff --git a/Lib/test/test_exceptions.py b/Lib/test/test_exceptions.py index 05a89e7705e9..bba2eeb88777 100644 --- a/Lib/test/test_exceptions.py +++ b/Lib/test/test_exceptions.py @@ -318,6 +318,10 @@ class ExceptionTests(unittest.TestCase): check('(yield i) = 2', 1, 2) check('def f(*):\n pass', 1, 7) + def testMemoryErrorBigSource(self): + with self.assertRaisesRegex(OverflowError, "column offset overflow"): + exec(f"if True:\n {' ' * 2**31}print('hello world')") + @cpython_only def testSettingException(self): # test that setting an exception at the C level works even if the diff --git a/Parser/pegen_errors.c b/Parser/pegen_errors.c index 2baae5289b56..15e99e23d849 100644 --- a/Parser/pegen_errors.c +++ b/Parser/pegen_errors.c @@ -235,6 +235,12 @@ _PyPegen_raise_error(Parser *p, PyObject *errtype, int use_mark, const char *err col_offset = 0; } else { const char* start = p->tok->buf ? p->tok->line_start : p->tok->buf; + if (p->tok->cur - start > INT_MAX) { + PyErr_SetString(PyExc_OverflowError, + "Parser column offset overflow - source line is too big"); + p->error_indicator = 1; + return NULL; + } col_offset = Py_SAFE_DOWNCAST(p->tok->cur - start, intptr_t, int); } } else {