git: cb35b3df20c2 - 2026Q2 - lang/python314: Security update to 3.14.4
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Sun, 12 Apr 2026 18:25:01 UTC
The branch 2026Q2 has been updated by diizzy:
URL: https://cgit.FreeBSD.org/ports/commit/?id=cb35b3df20c2be6293b0e5aaed2fd9933fa75713
commit cb35b3df20c2be6293b0e5aaed2fd9933fa75713
Author: Matthias Andree <mandree@FreeBSD.org>
AuthorDate: 2026-04-08 09:43:19 +0000
Commit: Daniel Engberg <diizzy@FreeBSD.org>
CommitDate: 2026-04-12 18:22:48 +0000
lang/python314: Security update to 3.14.4
Add a -flto=full option, which can speed up the port build
in terms of wallclock time at the expense of overall more
CPU time.
Issue a warning that test_ssl will fail from pre-test
if DEBUG is enabled.
Changelog: https://docs.python.org/release/3.14.4/whatsnew/changelog.html
PR: 294324
Which contains these security fixes:
pyexpat.c: Unbounded C recursion in conv_content_model causes crash
Security: https://github.com/python/cpython/issues/145986
/ CVE-2026-4224
Reject control characters in more places in http.cookies.Morsel
Security: https://github.com/python/cpython/issues/145599
/ CVE-2026-3644
SourcelessFileLoader does not use io.open_code()
Security: https://github.com/python/cpython/issues/145506
/ CVE-2026-2297
Disallow usage of control characters in status, headers and
values for security in Lib/wsgiref/handlers.py
Security: https://github.com/python/cpython/issues/144370
Reject leading dashes in webbrowser.open()
Security: https://github.com/python/cpython/issues/143930
/ 9fdad262-2e0f-11f1-88c7-00a098b42aeb
/ CVE-2026-4519
Excess Base64 data ignored after padding by default
Security: https://github.com/python/cpython/issues/145264
/ CVE-2026-3446
Additional security related PRs from upstream
HTTP proxy via "CONNECT" tunneling doesn't sanitize CR/LF
Obtained from: https://github.com/python/cpython/pull/148342
Security https://github.com/python/cpython/issues/146212
/ CVE-2026-1502
configparser.RawConfigParser.{OPTCRE,OPTCRE_NV} regexes vulnerable to
quadratic backtracking
Obtained from: https://github.com/python/cpython/pull/148287
Security: https://github.com/python/cpython/issues/146333
(cherry picked from commit 955268b87942c8ed7787c1cce516bf8bf8ff1041)
---
lang/python314/Makefile | 18 ++--
lang/python314/Makefile.version | 2 +-
lang/python314/distinfo | 6 +-
...211-reject-CR_LF-in-HTTP-tunnel-request-headers | 108 +++++++++++++++++++++
...ix-quadratic-regex-backtracking-in-configparser | 83 ++++++++++++++++
lang/python314/pkg-plist | 22 ++++-
6 files changed, 224 insertions(+), 15 deletions(-)
diff --git a/lang/python314/Makefile b/lang/python314/Makefile
index 554ce96668af..6830b8f512e0 100644
--- a/lang/python314/Makefile
+++ b/lang/python314/Makefile
@@ -1,6 +1,5 @@
PORTNAME= python
-DISTVERSION= ${PYTHON_DISTVERSION}
-PORTREVISION= 1
+DISTVERSION= ${PYTHON_DISTVERSION} # see Makefile.version
CATEGORIES= lang python
MASTER_SITES= PYTHON/ftp/python/${DISTVERSION:C/[a-z].*//}
PKGNAMESUFFIX= ${PYTHON_SUFFIX}
@@ -55,15 +54,18 @@ PLIST_SUB= ABI=${ABIFLAGS} \
XYZDOT=${DISTVERSION:C/[a-z].*//} \
OSMAJOR=${OSVERSION:C/([0-9]*)[0-9]{5}/\1/} # For plat-freebsd* in pkg-plist. https://bugs.python.org/issue19554
-OPTIONS_DEFINE= DEBUG IPV6 LIBMPDEC LTO NLS PYMALLOC
+OPTIONS_DEFINE= DEBUG IPV6 LIBMPDEC NLS PYMALLOC
OPTIONS_DEFAULT= LIBMPDEC LTO PYMALLOC
-OPTIONS_EXCLUDE_powerpc64= LTO
-OPTIONS_EXCLUDE_riscv64= LTO
-OPTIONS_RADIO= HASH
+OPTIONS_EXCLUDE_powerpc64= LTO LTOFULL
+OPTIONS_EXCLUDE_riscv64= LTO LTOFULL
+OPTIONS_RADIO= HASH LTO
OPTIONS_RADIO_HASH= FNV SIPHASH
+OPTIONS_RADIO_LTO= LTO LTOFULL
OPTIONS_SUB= yes
LIBMPDEC_DESC= Use libmpdec from ports instead of bundled version
+LTO_DESC= Use Link-Time Optimization with -flto=thin
+LTOFULL_DESC= Use -flto=full (not =thin) (faster build at more CPU time)
NLS_DESC= Enable gettext support for the locale module
PYMALLOC_DESC= Enable specialized mallocs
@@ -81,6 +83,7 @@ LIBMPDEC_CONFIGURE_ON= --with-system-libmpdec
LIBMPDEC_LIB_DEPENDS= libmpdec.so:math/mpdecimal
LTO_CONFIGURE_ON= --with-lto
+LTOFULL_CONFIGURE_ON= --with-lto=full
# Use CPPFLAGS over CFLAGS due to -I ordering, causing elementtree and pyexpat
# to break in Python 2.7, or preprocessor complaints in Python >= 3.3
@@ -180,6 +183,9 @@ sigstore-verify: ${_sigstorebundle} checksum
pre-test:
@${ECHO_CMD} "=== NOTE: the py314-* gdbm, sqlite3, tkinter modules must be rebuilt before the test ==="
+.if ${PORT_OPTIONS:MDEBUG}
+ @${ECHO_CMD} "=== NOTE: The test_ssl test is known to fail with DEBUG option enabled ==="
+.endif
sleep 5
post-clean:
diff --git a/lang/python314/Makefile.version b/lang/python314/Makefile.version
index bd8623e62931..c8ccfa3963b0 100644
--- a/lang/python314/Makefile.version
+++ b/lang/python314/Makefile.version
@@ -4,4 +4,4 @@
# 1. Update python documentation (lang/python-doc-*)
# Run "make -C lang/python-doc-html makesum"
# 2. Remove PORTREVISION in Makefile
-PYTHON_DISTVERSION= 3.14.3
+PYTHON_DISTVERSION= 3.14.4
diff --git a/lang/python314/distinfo b/lang/python314/distinfo
index a8bc1fff91f4..7c5dead58955 100644
--- a/lang/python314/distinfo
+++ b/lang/python314/distinfo
@@ -1,3 +1,3 @@
-TIMESTAMP = 1770247285
-SHA256 (python/Python-3.14.3.tar.xz) = a97d5549e9ad81fe17159ed02c68774ad5d266c72f8d9a0b5a9c371fe85d902b
-SIZE (python/Python-3.14.3.tar.xz) = 23778568
+TIMESTAMP = 1775640582
+SHA256 (python/Python-3.14.4.tar.xz) = d923c51303e38e249136fc1bdf3568d56ecb03214efdef48516176d3d7faaef8
+SIZE (python/Python-3.14.4.tar.xz) = 23855332
diff --git a/lang/python314/files/patch-gh-146211-reject-CR_LF-in-HTTP-tunnel-request-headers b/lang/python314/files/patch-gh-146211-reject-CR_LF-in-HTTP-tunnel-request-headers
new file mode 100644
index 000000000000..989f22a0529b
--- /dev/null
+++ b/lang/python314/files/patch-gh-146211-reject-CR_LF-in-HTTP-tunnel-request-headers
@@ -0,0 +1,108 @@
+From afdd351544e8112d4070a31f2218f99256697472 Mon Sep 17 00:00:00 2001
+From: Seth Larson <seth@python.org>
+Date: Fri, 10 Apr 2026 10:21:42 -0500
+Subject: [PATCH] gh-146211: Reject CR/LF in HTTP tunnel request headers
+ (GH-146212) (cherry picked from commit
+ 05ed7ce7ae9e17c23a04085b2539fe6d6d3cef69)
+
+Co-authored-by: Seth Larson <seth@python.org>
+Co-authored-by: Illia Volochii <illia.volochii@gmail.com>
+---
+ Lib/http/client.py | 11 ++++-
+ Lib/test/test_httplib.py | 45 +++++++++++++++++++
+ ...-03-20-09-29-42.gh-issue-146211.PQVbs7.rst | 2 +
+ 3 files changed, 57 insertions(+), 1 deletion(-)
+ create mode 100644 Misc/NEWS.d/next/Security/2026-03-20-09-29-42.gh-issue-146211.PQVbs7.rst
+
+diff --git a/Lib/http/client.py b/Lib/http/client.py
+index 77f8d26291dfc2..6fb7d254ea9c27 100644
+--- ./Lib/http/client.py
++++ b/Lib/http/client.py
+@@ -972,13 +972,22 @@ def _wrap_ipv6(self, ip):
+ return ip
+
+ def _tunnel(self):
++ if _contains_disallowed_url_pchar_re.search(self._tunnel_host):
++ raise ValueError('Tunnel host can\'t contain control characters %r'
++ % (self._tunnel_host,))
+ connect = b"CONNECT %s:%d %s\r\n" % (
+ self._wrap_ipv6(self._tunnel_host.encode("idna")),
+ self._tunnel_port,
+ self._http_vsn_str.encode("ascii"))
+ headers = [connect]
+ for header, value in self._tunnel_headers.items():
+- headers.append(f"{header}: {value}\r\n".encode("latin-1"))
++ header_bytes = header.encode("latin-1")
++ value_bytes = value.encode("latin-1")
++ if not _is_legal_header_name(header_bytes):
++ raise ValueError('Invalid header name %r' % (header_bytes,))
++ if _is_illegal_header_value(value_bytes):
++ raise ValueError('Invalid header value %r' % (value_bytes,))
++ headers.append(b"%s: %s\r\n" % (header_bytes, value_bytes))
+ headers.append(b"\r\n")
+ # Making a single send() call instead of one per line encourages
+ # the host OS to use a more optimal packet size instead of
+diff --git a/Lib/test/test_httplib.py b/Lib/test/test_httplib.py
+index bcb828edec7c39..6f3eac6b98a4de 100644
+--- ./Lib/test/test_httplib.py
++++ b/Lib/test/test_httplib.py
+@@ -369,6 +369,51 @@ def test_invalid_headers(self):
+ with self.assertRaisesRegex(ValueError, 'Invalid header'):
+ conn.putheader(name, value)
+
++ def test_invalid_tunnel_headers(self):
++ cases = (
++ ('Invalid\r\nName', 'ValidValue'),
++ ('Invalid\rName', 'ValidValue'),
++ ('Invalid\nName', 'ValidValue'),
++ ('\r\nInvalidName', 'ValidValue'),
++ ('\rInvalidName', 'ValidValue'),
++ ('\nInvalidName', 'ValidValue'),
++ (' InvalidName', 'ValidValue'),
++ ('\tInvalidName', 'ValidValue'),
++ ('Invalid:Name', 'ValidValue'),
++ (':InvalidName', 'ValidValue'),
++ ('ValidName', 'Invalid\r\nValue'),
++ ('ValidName', 'Invalid\rValue'),
++ ('ValidName', 'Invalid\nValue'),
++ ('ValidName', 'InvalidValue\r\n'),
++ ('ValidName', 'InvalidValue\r'),
++ ('ValidName', 'InvalidValue\n'),
++ )
++ for name, value in cases:
++ with self.subTest((name, value)):
++ conn = client.HTTPConnection('example.com')
++ conn.set_tunnel('tunnel', headers={
++ name: value
++ })
++ conn.sock = FakeSocket('')
++ with self.assertRaisesRegex(ValueError, 'Invalid header'):
++ conn._tunnel() # Called in .connect()
++
++ def test_invalid_tunnel_host(self):
++ cases = (
++ 'invalid\r.host',
++ '\ninvalid.host',
++ 'invalid.host\r\n',
++ 'invalid.host\x00',
++ 'invalid host',
++ )
++ for tunnel_host in cases:
++ with self.subTest(tunnel_host):
++ conn = client.HTTPConnection('example.com')
++ conn.set_tunnel(tunnel_host)
++ conn.sock = FakeSocket('')
++ with self.assertRaisesRegex(ValueError, 'Tunnel host can\'t contain control characters'):
++ conn._tunnel() # Called in .connect()
++
+ def test_headers_debuglevel(self):
+ body = (
+ b'HTTP/1.1 200 OK\r\n'
+diff --git a/Misc/NEWS.d/next/Security/2026-03-20-09-29-42.gh-issue-146211.PQVbs7.rst b/Misc/NEWS.d/next/Security/2026-03-20-09-29-42.gh-issue-146211.PQVbs7.rst
+new file mode 100644
+index 00000000000000..4993633b8ebebb
+--- /dev/null
++++ ./Misc/NEWS.d/next/Security/2026-03-20-09-29-42.gh-issue-146211.PQVbs7.rst
+@@ -0,0 +1,2 @@
++Reject CR/LF characters in tunnel request headers for the
++HTTPConnection.set_tunnel() method.
diff --git a/lang/python314/files/patch-gh-146333-Fix-quadratic-regex-backtracking-in-configparser b/lang/python314/files/patch-gh-146333-Fix-quadratic-regex-backtracking-in-configparser
new file mode 100644
index 000000000000..7dffa8ff1cfe
--- /dev/null
+++ b/lang/python314/files/patch-gh-146333-Fix-quadratic-regex-backtracking-in-configparser
@@ -0,0 +1,83 @@
+From ab8704a8e05e2f926c10f994e4085e8726048fa4 Mon Sep 17 00:00:00 2001
+From: Joshua Swanson <22283299+joshuaswanson@users.noreply.github.com>
+Date: Tue, 7 Apr 2026 16:10:34 +0200
+Subject: [PATCH] gh-146333: Fix quadratic regex backtracking in configparser
+ option parsing (GH-146399)
+
+Use negative lookahead in option regex to prevent backtracking, and to avoid changing logic outside the regexes (since people could use the regex directly).
+(cherry picked from commit 7e0a0be4097f9d29d66fe23f5af86f18a34ed7dd)
+
+Co-authored-by: Joshua Swanson <22283299+joshuaswanson@users.noreply.github.com>
+---
+ Lib/configparser.py | 8 ++++++--
+ Lib/test/test_configparser.py | 20 +++++++++++++++++++
+ ...3-25-00-51-03.gh-issue-146333.LqdL__bn.rst | 3 +++
+ 3 files changed, 29 insertions(+), 2 deletions(-)
+ create mode 100644 Misc/NEWS.d/next/Security/2026-03-25-00-51-03.gh-issue-146333.LqdL__bn.rst
+
+diff --git a/Lib/configparser.py b/Lib/configparser.py
+index d435a5c2fe0da2..e76647d339e913 100644
+--- ./Lib/configparser.py
++++ b/Lib/configparser.py
+@@ -613,7 +613,9 @@ class RawConfigParser(MutableMapping):
+ \] # ]
+ """
+ _OPT_TMPL = r"""
+- (?P<option>.*?) # very permissive!
++ (?P<option> # very permissive!
++ (?:(?!{delim})\S)* # non-delimiter non-whitespace
++ (?:\s+(?:(?!{delim})\S)+)*) # optionally more words
+ \s*(?P<vi>{delim})\s* # any number of space/tab,
+ # followed by any of the
+ # allowed delimiters,
+@@ -621,7 +623,9 @@ class RawConfigParser(MutableMapping):
+ (?P<value>.*)$ # everything up to eol
+ """
+ _OPT_NV_TMPL = r"""
+- (?P<option>.*?) # very permissive!
++ (?P<option> # very permissive!
++ (?:(?!{delim})\S)* # non-delimiter non-whitespace
++ (?:\s+(?:(?!{delim})\S)+)*) # optionally more words
+ \s*(?: # any number of space/tab,
+ (?P<vi>{delim})\s* # optionally followed by
+ # any of the allowed
+diff --git a/Lib/test/test_configparser.py b/Lib/test/test_configparser.py
+index 1bfb53ccbb1398..d7c4f19c1a5ef0 100644
+--- ./Lib/test/test_configparser.py
++++ b/Lib/test/test_configparser.py
+@@ -2270,6 +2270,26 @@ def test_section_bracket_in_key(self):
+ output.close()
+
+
++class ReDoSTestCase(unittest.TestCase):
++ """Regression tests for quadratic regex backtracking (gh-146333)."""
++
++ def test_option_regex_does_not_backtrack(self):
++ # A line with many spaces between non-delimiter characters
++ # should be parsed in linear time, not quadratic.
++ parser = configparser.RawConfigParser()
++ content = "[section]\n" + "x" + " " * 40000 + "y" + "\n"
++ # This should complete almost instantly. Before the fix,
++ # it would take over a minute due to catastrophic backtracking.
++ with self.assertRaises(configparser.ParsingError):
++ parser.read_string(content)
++
++ def test_option_regex_no_value_does_not_backtrack(self):
++ parser = configparser.RawConfigParser(allow_no_value=True)
++ content = "[section]\n" + "x" + " " * 40000 + "y" + "\n"
++ parser.read_string(content)
++ self.assertTrue(parser.has_option("section", "x" + " " * 40000 + "y"))
++
++
+ class MiscTestCase(unittest.TestCase):
+ def test__all__(self):
+ support.check__all__(self, configparser, not_exported={"Error"})
+diff --git a/Misc/NEWS.d/next/Security/2026-03-25-00-51-03.gh-issue-146333.LqdL__bn.rst b/Misc/NEWS.d/next/Security/2026-03-25-00-51-03.gh-issue-146333.LqdL__bn.rst
+new file mode 100644
+index 00000000000000..96d86ecc0a0fb3
+--- /dev/null
++++ ./Misc/NEWS.d/next/Security/2026-03-25-00-51-03.gh-issue-146333.LqdL__bn.rst
+@@ -0,0 +1,3 @@
++Fix quadratic backtracking in :class:`configparser.RawConfigParser` option
++parsing regexes (``OPTCRE`` and ``OPTCRE_NV``). A crafted configuration line
++with many whitespace characters could cause excessive CPU usage.
diff --git a/lang/python314/pkg-plist b/lang/python314/pkg-plist
index 9eb131523957..b529fcd0dd41 100644
--- a/lang/python314/pkg-plist
+++ b/lang/python314/pkg-plist
@@ -1847,7 +1847,7 @@ lib/python%%XYDOT%%/ensurepip/__pycache__/__main__.cpython-%%XY%%.pyc
lib/python%%XYDOT%%/ensurepip/__pycache__/_uninstall.cpython-%%XY%%.opt-1.pyc
lib/python%%XYDOT%%/ensurepip/__pycache__/_uninstall.cpython-%%XY%%.opt-2.pyc
lib/python%%XYDOT%%/ensurepip/__pycache__/_uninstall.cpython-%%XY%%.pyc
-lib/python%%XYDOT%%/ensurepip/_bundled/pip-25.3-py3-none-any.whl
+lib/python%%XYDOT%%/ensurepip/_bundled/pip-26.0.1-py3-none-any.whl
lib/python%%XYDOT%%/ensurepip/_uninstall.py
lib/python%%XYDOT%%/enum.py
lib/python%%XYDOT%%/filecmp.py
@@ -2974,6 +2974,9 @@ lib/python%%XYDOT%%/test/__pycache__/mp_preload.cpython-%%XY%%.pyc
lib/python%%XYDOT%%/test/__pycache__/mp_preload_flush.cpython-%%XY%%.opt-1.pyc
lib/python%%XYDOT%%/test/__pycache__/mp_preload_flush.cpython-%%XY%%.opt-2.pyc
lib/python%%XYDOT%%/test/__pycache__/mp_preload_flush.cpython-%%XY%%.pyc
+lib/python%%XYDOT%%/test/__pycache__/mp_preload_large_sysargv.cpython-%%XY%%.opt-1.pyc
+lib/python%%XYDOT%%/test/__pycache__/mp_preload_large_sysargv.cpython-%%XY%%.opt-2.pyc
+lib/python%%XYDOT%%/test/__pycache__/mp_preload_large_sysargv.cpython-%%XY%%.pyc
lib/python%%XYDOT%%/test/__pycache__/mp_preload_main.cpython-%%XY%%.opt-1.pyc
lib/python%%XYDOT%%/test/__pycache__/mp_preload_main.cpython-%%XY%%.opt-2.pyc
lib/python%%XYDOT%%/test/__pycache__/mp_preload_main.cpython-%%XY%%.pyc
@@ -4634,6 +4637,7 @@ lib/python%%XYDOT%%/test/libregrtest/findtests.py
lib/python%%XYDOT%%/test/libregrtest/logger.py
lib/python%%XYDOT%%/test/libregrtest/parallel_case.py
lib/python%%XYDOT%%/test/libregrtest/tsan.py
+lib/python%%XYDOT%%/test/mp_preload_large_sysargv.py
lib/python%%XYDOT%%/test/regrtestdata/import_from_tests/__pycache__/test_regrtest_a.cpython-%%XY%%.opt-1.pyc
lib/python%%XYDOT%%/test/regrtestdata/import_from_tests/__pycache__/test_regrtest_a.cpython-%%XY%%.opt-2.pyc
lib/python%%XYDOT%%/test/regrtestdata/import_from_tests/__pycache__/test_regrtest_a.cpython-%%XY%%.pyc
@@ -5827,6 +5831,9 @@ lib/python%%XYDOT%%/test/test_free_threading/__pycache__/test_capi.cpython-%%XY%
lib/python%%XYDOT%%/test/test_free_threading/__pycache__/test_code.cpython-%%XY%%.opt-1.pyc
lib/python%%XYDOT%%/test/test_free_threading/__pycache__/test_code.cpython-%%XY%%.opt-2.pyc
lib/python%%XYDOT%%/test/test_free_threading/__pycache__/test_code.cpython-%%XY%%.pyc
+lib/python%%XYDOT%%/test/test_free_threading/__pycache__/test_collections.cpython-%%XY%%.opt-1.pyc
+lib/python%%XYDOT%%/test/test_free_threading/__pycache__/test_collections.cpython-%%XY%%.opt-2.pyc
+lib/python%%XYDOT%%/test/test_free_threading/__pycache__/test_collections.cpython-%%XY%%.pyc
lib/python%%XYDOT%%/test/test_free_threading/__pycache__/test_cprofile.cpython-%%XY%%.opt-1.pyc
lib/python%%XYDOT%%/test/test_free_threading/__pycache__/test_cprofile.cpython-%%XY%%.opt-2.pyc
lib/python%%XYDOT%%/test/test_free_threading/__pycache__/test_cprofile.cpython-%%XY%%.pyc
@@ -5842,6 +5849,9 @@ lib/python%%XYDOT%%/test/test_free_threading/__pycache__/test_dict.cpython-%%XY%
lib/python%%XYDOT%%/test/test_free_threading/__pycache__/test_enumerate.cpython-%%XY%%.opt-1.pyc
lib/python%%XYDOT%%/test/test_free_threading/__pycache__/test_enumerate.cpython-%%XY%%.opt-2.pyc
lib/python%%XYDOT%%/test/test_free_threading/__pycache__/test_enumerate.cpython-%%XY%%.pyc
+lib/python%%XYDOT%%/test/test_free_threading/__pycache__/test_frame.cpython-%%XY%%.opt-1.pyc
+lib/python%%XYDOT%%/test/test_free_threading/__pycache__/test_frame.cpython-%%XY%%.opt-2.pyc
+lib/python%%XYDOT%%/test/test_free_threading/__pycache__/test_frame.cpython-%%XY%%.pyc
lib/python%%XYDOT%%/test/test_free_threading/__pycache__/test_func_annotations.cpython-%%XY%%.opt-1.pyc
lib/python%%XYDOT%%/test/test_free_threading/__pycache__/test_func_annotations.cpython-%%XY%%.opt-2.pyc
lib/python%%XYDOT%%/test/test_free_threading/__pycache__/test_func_annotations.cpython-%%XY%%.pyc
@@ -5914,11 +5924,13 @@ lib/python%%XYDOT%%/test/test_free_threading/__pycache__/test_zip.cpython-%%XY%%
lib/python%%XYDOT%%/test/test_free_threading/test_bisect.py
lib/python%%XYDOT%%/test/test_free_threading/test_capi.py
lib/python%%XYDOT%%/test/test_free_threading/test_code.py
+lib/python%%XYDOT%%/test/test_free_threading/test_collections.py
lib/python%%XYDOT%%/test/test_free_threading/test_cprofile.py
lib/python%%XYDOT%%/test/test_free_threading/test_csv.py
lib/python%%XYDOT%%/test/test_free_threading/test_dbm_gnu.py
lib/python%%XYDOT%%/test/test_free_threading/test_dict.py
lib/python%%XYDOT%%/test/test_free_threading/test_enumerate.py
+lib/python%%XYDOT%%/test/test_free_threading/test_frame.py
lib/python%%XYDOT%%/test/test_free_threading/test_func_annotations.py
lib/python%%XYDOT%%/test/test_free_threading/test_functools.py
lib/python%%XYDOT%%/test/test_free_threading/test_gc.py
@@ -6946,9 +6958,6 @@ lib/python%%XYDOT%%/test/test_pyrepl/__pycache__/__init__.cpython-%%XY%%.pyc
lib/python%%XYDOT%%/test/test_pyrepl/__pycache__/__main__.cpython-%%XY%%.opt-1.pyc
lib/python%%XYDOT%%/test/test_pyrepl/__pycache__/__main__.cpython-%%XY%%.opt-2.pyc
lib/python%%XYDOT%%/test/test_pyrepl/__pycache__/__main__.cpython-%%XY%%.pyc
-lib/python%%XYDOT%%/test/test_pyrepl/__pycache__/eio_test_script.cpython-%%XY%%.opt-1.pyc
-lib/python%%XYDOT%%/test/test_pyrepl/__pycache__/eio_test_script.cpython-%%XY%%.opt-2.pyc
-lib/python%%XYDOT%%/test/test_pyrepl/__pycache__/eio_test_script.cpython-%%XY%%.pyc
lib/python%%XYDOT%%/test/test_pyrepl/__pycache__/support.cpython-%%XY%%.opt-1.pyc
lib/python%%XYDOT%%/test/test_pyrepl/__pycache__/support.cpython-%%XY%%.opt-2.pyc
lib/python%%XYDOT%%/test/test_pyrepl/__pycache__/support.cpython-%%XY%%.pyc
@@ -6982,7 +6991,6 @@ lib/python%%XYDOT%%/test/test_pyrepl/__pycache__/test_utils.cpython-%%XY%%.pyc
lib/python%%XYDOT%%/test/test_pyrepl/__pycache__/test_windows_console.cpython-%%XY%%.opt-1.pyc
lib/python%%XYDOT%%/test/test_pyrepl/__pycache__/test_windows_console.cpython-%%XY%%.opt-2.pyc
lib/python%%XYDOT%%/test/test_pyrepl/__pycache__/test_windows_console.cpython-%%XY%%.pyc
-lib/python%%XYDOT%%/test/test_pyrepl/eio_test_script.py
lib/python%%XYDOT%%/test/test_pyrepl/support.py
lib/python%%XYDOT%%/test/test_pyrepl/test_eventqueue.py
lib/python%%XYDOT%%/test/test_pyrepl/test_input.py
@@ -7307,6 +7315,9 @@ lib/python%%XYDOT%%/test/test_tools/__pycache__/__init__.cpython-%%XY%%.pyc
lib/python%%XYDOT%%/test/test_tools/__pycache__/__main__.cpython-%%XY%%.opt-1.pyc
lib/python%%XYDOT%%/test/test_tools/__pycache__/__main__.cpython-%%XY%%.opt-2.pyc
lib/python%%XYDOT%%/test/test_tools/__pycache__/__main__.cpython-%%XY%%.pyc
+lib/python%%XYDOT%%/test/test_tools/__pycache__/test_compute_changes.cpython-%%XY%%.opt-1.pyc
+lib/python%%XYDOT%%/test/test_tools/__pycache__/test_compute_changes.cpython-%%XY%%.opt-2.pyc
+lib/python%%XYDOT%%/test/test_tools/__pycache__/test_compute_changes.cpython-%%XY%%.pyc
lib/python%%XYDOT%%/test/test_tools/__pycache__/test_freeze.cpython-%%XY%%.opt-1.pyc
lib/python%%XYDOT%%/test/test_tools/__pycache__/test_freeze.cpython-%%XY%%.opt-2.pyc
lib/python%%XYDOT%%/test/test_tools/__pycache__/test_freeze.cpython-%%XY%%.pyc
@@ -7370,6 +7381,7 @@ lib/python%%XYDOT%%/test/test_tools/msgfmt_data/fuzzy.po
lib/python%%XYDOT%%/test/test_tools/msgfmt_data/general.json
lib/python%%XYDOT%%/test/test_tools/msgfmt_data/general.mo
lib/python%%XYDOT%%/test/test_tools/msgfmt_data/general.po
+lib/python%%XYDOT%%/test/test_tools/test_compute_changes.py
lib/python%%XYDOT%%/test/test_tools/test_freeze.py
lib/python%%XYDOT%%/test/test_tools/test_i18n.py
lib/python%%XYDOT%%/test/test_tools/test_makefile.py