git: cb35b3df20c2 - 2026Q2 - lang/python314: Security update to 3.14.4

From: Daniel Engberg <diizzy_at_FreeBSD.org>
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