Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 6 additions & 3 deletions Lib/configparser.py
Original file line number Diff line number Diff line change
Expand Up @@ -315,12 +315,15 @@ def __init__(self, source, *args):

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
Expand Down
13 changes: 13 additions & 0 deletions Lib/test/test_configparser.py
Original file line number Diff line number Diff line change
Expand Up @@ -1729,6 +1729,19 @@ def test_error(self):
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.assertStartsWith(errlines[0], "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')
Expand Down
Original file line number Diff line number Diff line change
@@ -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.
Loading