]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
[3.11] gh-107715: Escape class name in regular expression (GH-107716) (GH-107727)
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Sat, 12 Aug 2023 11:57:49 +0000 (04:57 -0700)
committerGitHub <noreply@github.com>
Sat, 12 Aug 2023 11:57:49 +0000 (11:57 +0000)
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.
(cherry picked from commit 85793278793708ad6b7132a54ac9fb4b2c5bcac1)

Co-authored-by: Gertjan van Zwieten <git@gjvz.nl>
Lib/doctest.py
Misc/NEWS.d/next/Library/2023-08-07-14-12-07.gh-issue-107715.238r2f.rst [new file with mode: 0644]

index dafad505ef0e86a11b289da0ae7a9b01ae966e84..8fcb4ee0a02ee094a21dded63e4607b1010f6a59 100644 (file)
@@ -1104,7 +1104,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
diff --git a/Misc/NEWS.d/next/Library/2023-08-07-14-12-07.gh-issue-107715.238r2f.rst b/Misc/NEWS.d/next/Library/2023-08-07-14-12-07.gh-issue-107715.238r2f.rst
new file mode 100644 (file)
index 0000000..4bf08c0
--- /dev/null
@@ -0,0 +1 @@
+Fix :meth:`doctest.DocTestFinder.find` in presence of class names with special characters. Patch by Gertjan van Zwieten.