mirror of
https://github.com/python/cpython.git
synced 2026-05-06 04:37:33 -04:00
[3.13] gh-148370: prevent quadratic behavior in configparser.ParsingError.combine (GH-148452) (#148533)
gh-148370: prevent quadratic behavior in `configparser.ParsingError.combine` (GH-148452)
(cherry picked from commit 2662db0c45)
Co-authored-by: Bénédikt Tran <10796600+picnixz@users.noreply.github.com>
This commit is contained in:
committed by
GitHub
parent
d82c491b2e
commit
a69b14bc01
+6
-3
@@ -316,12 +316,15 @@ class ParsingError(Error):
|
||||
|
||||
def append(self, lineno, line):
|
||||
self.errors.append((lineno, line))
|
||||
self.message += '\n\t[line %2d]: %s' % (lineno, repr(line))
|
||||
self.message += f'\n\t[line {lineno:2d}]: {line!r}'
|
||||
|
||||
def combine(self, others):
|
||||
messages = [self.message]
|
||||
for other in others:
|
||||
for error in other.errors:
|
||||
self.append(*error)
|
||||
for lineno, line in other.errors:
|
||||
self.errors.append((lineno, line))
|
||||
messages.append(f'\n\t[line {lineno:2d}]: {line!r}')
|
||||
self.message = "".join(messages)
|
||||
return self
|
||||
|
||||
@staticmethod
|
||||
|
||||
@@ -1729,6 +1729,19 @@ class ExceptionPicklingTestCase(unittest.TestCase):
|
||||
self.assertEqual(e1.message, e2.message)
|
||||
self.assertEqual(repr(e1), repr(e2))
|
||||
|
||||
def test_combine_error_linear_complexity(self):
|
||||
# Ensure that ParsingError.combine() has linear complexity.
|
||||
# See https://github.com/python/cpython/issues/148370.
|
||||
n = 50000
|
||||
s = '[*]\n' + (err_line := '=\n') * n
|
||||
p = configparser.ConfigParser(strict=False)
|
||||
with self.assertRaises(configparser.ParsingError) as cm:
|
||||
p.read_string(s)
|
||||
errlines = cm.exception.message.splitlines()
|
||||
self.assertEqual(len(errlines), n + 1)
|
||||
self.assertTrue(errlines[0].startswith("Source contains parsing errors: "))
|
||||
self.assertEqual(errlines[42], f"\t[line {43:2d}]: {err_line!r}")
|
||||
|
||||
def test_nosectionerror(self):
|
||||
import pickle
|
||||
e1 = configparser.NoSectionError('section')
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
:mod:`configparser`: prevent quadratic behavior when a :exc:`~configparser.ParsingError`
|
||||
is raised after a parser fails to parse multiple lines. Patch by Bénédikt Tran.
|
||||
Reference in New Issue
Block a user