summaryrefslogtreecommitdiffstats
path: root/Lib/doctest.py
diff options
context:
space:
mode:
authorGertjan van Zwieten <git@gjvz.nl>2023-08-07 15:24:02 (GMT)
committerGitHub <noreply@github.com>2023-08-07 15:24:02 (GMT)
commit85793278793708ad6b7132a54ac9fb4b2c5bcac1 (patch)
tree20879feeddb2c89ad209d1235607759442e08a73 /Lib/doctest.py
parented64204716035db58c7e11b78182596aa2d97176 (diff)
downloadcpython-85793278793708ad6b7132a54ac9fb4b2c5bcac1.zip
cpython-85793278793708ad6b7132a54ac9fb4b2c5bcac1.tar.gz
cpython-85793278793708ad6b7132a54ac9fb4b2c5bcac1.tar.bz2
gh-107715: Escape class name in regular expression (GH-107716)
This patch escapes the class name before embedding it in the regular expression for `pat` in `doctest.DocTestFinder._find_lineno`. While class names do not ordinarily contain special characters, it is possible to encounter these when a class is created dynamically. Escaping the name will correctly return `None` in this scenario, rather than potentially matching a different class or raising `re.error` depending on the symbols used.
Diffstat (limited to 'Lib/doctest.py')
-rw-r--r--Lib/doctest.py2
1 files changed, 1 insertions, 1 deletions
diff --git a/Lib/doctest.py b/Lib/doctest.py
index 2776d74..a63df46 100644
--- a/Lib/doctest.py
+++ b/Lib/doctest.py
@@ -1110,7 +1110,7 @@ class DocTestFinder:
if source_lines is None:
return None
pat = re.compile(r'^\s*class\s*%s\b' %
- getattr(obj, '__name__', '-'))
+ re.escape(getattr(obj, '__name__', '-')))
for i, line in enumerate(source_lines):
if pat.match(line):
lineno = i