Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package python313 for openSUSE:Factory checked in at 2026-07-22 19:01:05 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python313 (Old) and /work/SRC/openSUSE:Factory/.python313.new.24530 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python313" Wed Jul 22 19:01:05 2026 rev:43 rq:1366438 version:3.13.14 Changes: -------- --- /work/SRC/openSUSE:Factory/python313/python313.changes 2026-06-19 17:22:10.395719459 +0200 +++ /work/SRC/openSUSE:Factory/.python313.new.24530/python313.changes 2026-07-22 19:01:14.229095898 +0200 @@ -1,0 +2,348 @@ +Fri Jul 17 10:06:01 UTC 2026 - Matej Cepl <[email protected]> + +- CVE-2026-11940: fix the symlink escape via tarfile + hardlink-extraction fallback (bsc#1268977) + CVE-2026-11940-tarfile-escape.patch + +------------------------------------------------------------------- +Thu Jul 2 23:25:00 CEST 2026 - Matej Cepl <[email protected]> + +- CVE-2025-15367: reject control characters in POP3 commands + (bsc#1257041) + CVE-2025-15366-pop3-ctrl-chars.patch + +------------------------------------------------------------------- +Thu Jul 2 23:22:09 CEST 2026 - Matej Cepl <[email protected]> + +- CVE-2025-15366: reject control characters in IMAP commands + (bsc#1257044, gh#python/cpython!143922) + CVE-2025-15366-imap-ctrl-chars.patch + +------------------------------------------------------------------- +Wed Jun 17 13:00:34 UTC 2026 - Matej Cepl <[email protected]> + +- Update to 3.13.14: + - Security + - gh-151159: Bumps the OpenSSL version to 3.0.21 on Android. + - gh-150599: Fix a possible stack buffer overflow in bz2 when + a bz2.BZ2Decompressor is reused after a decompression + error. The decompressor now becomes unusable after libbz2 + reports an error. + - gh-149835: shutil.move() now resolves symlinks via + os.path.realpath() when checking whether the destination is + inside the source directory, preventing a symlink-based + bypass of that guard. + - gh-149698: Update bundled libexpat to version 2.8.1 for the + fix for CVE 2026-45186. + - gh-87451: The ftplib module’s undocumented ftpcp function + no longer trusts the IPv4 address value returned from the + source server in response to the PASV command by default, + completing the fix for CVE-2021-4189. As with ftplib.FTP, + the former behavior can be re-enabled by setting the + trust_server_pasv_ipv4_address attribute on the source + ftplib.FTP instance to True. Thanks to Qi Deng at Aurascape + AI for the report (bsc#1265268, CVE-2026-8328) + - gh-149486: tarfile.data_filter() now validates link targets + using the same normalised value that is written to disk, + strips trailing separators from the member name when + resolving a symlink’s directory, and rejects link members + that would replace the destination directory itself. This + closes several path-traversal bypasses of the data + extraction filter. + - gh-149079: Fix a potential denial of service in + unicodedata.normalize(). The canonical ordering step of + Unicode normalization used a quadratic-time insertion sort + for reordering combining characters, which could be + exploited with crafted input containing many combining + characters in non-canonical order. Replaced with + a linear-time counting sort for long runs. + - gh-149018: Improved protection against XML hash-flooding + attacks in xml.parsers.expat and xml.etree.ElementTree when + Python is compiled with libExpat 2.8.0 or later + (CVE-2026-7210, bsc#1264962). + - gh-149017: Update bundled libexpat to version 2.8.0. + - gh-90309: Base64-encode values when embedding cookies to + JavaScript using the http.cookies.BaseCookie.js_output() + method to avoid injection and escaping. (bsc#1262654, + CVE-2026-6019) + - gh-148808: Added buffer boundary check when using nbytes + parameter with + asyncio.AbstractEventLoop.sock_recvfrom_into(). Only + relevant for Windows and the asyncio.ProactorEventLoop. + - gh-148395: Fix a dangling input pointer in + lzma.LZMADecompressor, bz2.BZ2Decompressor, and internal + zlib._ZlibDecompressor when memory allocation fails with + MemoryError, which could let a subsequent decompress() call + read or write through a stale pointer to the + already-released caller buffer. (bsc#1262098, + CVE-2026-6100, seems like it has been incompletely applied + gh#python/cpython#151605) + - gh-148169: A bypass in webbrowser allowed URLs prefixed + with %action to pass the dash-prefix safety check + (bsc#1262098, CVE-2026-6100). + - gh-146581: Fix vulnerability in shutil.unpack_archive() for + ZIP files on Windows which allowed to write files outside + of the destination tree if the patch in the archive + contains a Windows drive prefix. Now such invalid paths + will be skipped. Files containing “..” in the name (like + “foo..bar”) are no longer skipped. + - gh-146333: Fix quadratic backtracking in + configparser.RawConfigParser option parsing regexes (OPTCRE + and OPTCRE_NV). A crafted configuration line with many + whitespace characters could cause excessive CPU usage. + - gh-146211: Reject CR/LF characters in tunnel request + headers for the HTTPConnection.set_tunnel() method. + (bsc#1261969, CVE-2026-1502) + - Core and Builtins + - gh-151112: Fix a crash in the compiler that could occur + when running out of memory. + - gh-151126: Fix a crash, when there’s no memory left on + a device, which happened in: + - code compilation - _winapi.CreateProcess() + - Now these places raise proper MemoryError errors. + - gh-150633: Fix the frozen importer accepting module names + with embedded null bytes, which caused it to bypass the + sys.modules cache and create duplicate module objects. + - gh-149156: Fix an intermittent crash after os.fork() when + perf trampoline profiling is enabled and the child returns + through trampoline frames inherited from the parent + process. + - gh-149449: Fix a use-after-free crash when the unicodedata + module was removed from sys.modules and garbage-collected + between calls that decode \N{...} escapes or use the + namereplace codec error handler. + - gh-148450: Fix abc.register() so it invalidates type + version tags for registered classes. + - gh-150207: Fix a crash when a memory allocation fails + during tokenizer initialization. A proper MemoryError is + now raised instead. + - gh-150107: asyncio: sendfile() and sock_sendfile() event + loop methods now call file.seek(offset) if file has + a seek() method, even if offset is 0 (default value). + - gh-150146: Fix a crash on a complex type variable + substitution. + - from typing import TypeVar; + memoryview[TypeVar("")][*typing.Mapping[..., ...]] used to + fail due to missing NULL check on _unpack_args C function + call. + - gh-149590: Fix crash when faulthandler is imported more + than once. + - gh-149738: sqlite3: Disallow removing row_factory and + text_factory attributes of a connection to prevent a crash + on a query. + - gh-139808: Add branch protections for AArch64 (BTI/PAC) in + assembly code used by -X perf_jit (Linux perf profiler + integration). + - gh-148820: Fix a race in _PyRawMutex on the free-threaded + build where a Py_PARK_INTR return from _PySemaphore_Wait + could let the waiter destroy its semaphore before the + unlocking thread’s _PySemaphore_Wakeup completed, causing + a fatal ReleaseSemaphore error. + - gh-148653: Forbid marshalling recursive code objects which + cannot be correctly unmarshalled. + - gh-148390: Fix an undefined behavior in memoryview when + using the native boolean format (?) in cast(). Previously, + on some common platforms, calling + memoryview(b).cast("?").tolist() incorrectly returned + [False] instead of [True] for any even byte b. Patch by + Bénédikt Tran. + - gh-148418: Fix a possible reference leak in a corrupted + TYPE_CODE marshal stream. + - gh-148222: Fix vectorcall support in types.GenericAlias + when the underlying type does not support the vectorcall + protocol. Fix possible leaks in types.GenericAlias and + types.UnionType in case of memory error. + - gh-145376: Fix reference leaks in various unusual error + scenarios. + - C API + - gh-150907: Fix dynamic_annotations.h header file when built + with C++ and Valgrind: add extern "C++" scope for the C++ + template. Patch by Victor Stinner. + - Build + - gh-149351: Avoid possible broken macOS framework install + names when DESTDIR is specified during builds. + - gh-146475: Block Apple Clang from being used to build the + JIT as it ships without required LLVM tools. + - gh-148535: No longer use the gcc -fprofile-update=atomic + flag on i686. The flag has been added to fix a random GCC + internal error on PGO build (gh-145801) caused by + corruption of profile data (.gcda files). The problem is + that it makes the PGO build way slower (up to 47x slower) + on i686. Since the GCC internal error was not seen on i686 + so far, don’t use -fprofile-update=atomic on i686 anymore. + Patch by Victor Stinner. + - Library + - gh-150913: Fix sqlite3.Blob slice assignment to raise + TypeError and IndexError for type and size mismatches + respectively, even when the target slice is empty. + - gh-143008: Fix race conditions when re-initializing + a io.TextIOWrapper object. + - gh-150685: Update bundled pip to 26.1.2 + - gh-150406: Fix a possible crash occurring during socket + module initialization when the system is out of memory on + platforms without a reentrant gethostbyname. + - gh-150372: readline: Fix a potential crash during tab + completion caused by an out-of-memory error during module + initialization. + - gh-150175: Fix race condition in + unittest.mock.ThreadingMock where concurrent calls could + lose increments to call_count and other attributes due to + a missing lock in _increment_mock_call. + - gh-84353: Preserve non-UTF-8 encoded filenames when + appending to a zipfile.ZipFile. Previously, non-ASCII names + stored in a legacy encoding (without the UTF-8 flag bit + set) could be corrupted when the central directory was + rewritten: they were decoded as cp437 and then re-stored as + UTF-8. + - gh-149995: Update various docstrings in typing. + - gh-88726: The email package now uses standard MIME charset + names “gb2312” and “big5” instead of non-standard names + “eucgb2312_cn” and “big5_tw”. + - gh-149571: Fix the C implementation of + xml.etree.ElementTree.Element.itertext(): it no longer + emits text for comments and processing instructions. + - gh-149921: Fix reference leaks in error paths of the + _interpchannels and _interpqueues extension modules. + - gh-149801: Add IANA registered names and aliases with + leading zeros before number (like IBM00858, CP00858, + IBM01140, CP01140) for corresponding codecs. + - gh-149701: Fix bad return code from Lib/venv/bin/activate + if hashing is disabled + - gh-112821: In the REPL, autocompletion might run arbitrary + code in the getter of a descriptor. If that getter raised + an exception, autocompletion would fail to present any + options for the entire object. Autocompletion now works as + expected for these objects. + - gh-149388: Make asyncio.windows_utils.PipeHandle closing + idempotent. + - gh-149489: Fix ElementTree serialization to HTML. The + content of elements “xmp”, “iframe”, “noembed”, “noframes”, + and “plaintext” is no longer escaped. The “plaintext” + element no longer have the closing tag. + - gh-149377: Update bundled pip to 26.1.1 + - gh-149231: In tomllib, the number of parts in TOML keys is + now limited. + - gh-149117: Fix runpy.run_module() and runpy.run_path() to + set the name attribute on the ImportError they raise. + - gh-149148: ensurepip: Upgrade bundled pip to 26.1. This + version fixes the CVE 2026-3219 vulnerability. Patch by + Victor Stinner. + - gh-148093: Fix an out-of-bounds read of one byte in + binascii.a2b_uu(). Raise binascii.Error, instead of reading + past the buffer end. + - gh-148914: Fix memoization of in-band PickleBuffer in the + Python implementation of pickle. Previously, identical + PickleBuffers did not preserve identity, and empty writable + PickleBuffer memoized an empty bytearray object in place of + b'', so the following references to b'' were unpickled as + an empty bytearray object. + - gh-138907: Support RFC 9309 in urllib.robotparser. + - gh-148954: Fix XML injection vulnerability in + xmlrpc.client.dumps() where the methodname was not being + escaped before interpolation into the XML body. + - gh-148801: xml.etree.ElementTree: Fix a crash in + Element.__deepcopy__ on deeply nested trees. + - gh-148735: xml.etree.ElementTree: Fix a use-after-free in + Element.findtext when the element tree is mutated + concurrently during the search. + - gh-146553: Fix infinite loop in typing.get_type_hints() + when __wrapped__ forms a cycle. Patch by Shamil Abdulaev. + - gh-148508: An intermittent timing error when running SSL + tests on iOS has been resolved. + - gh-148518: If an email containing an address header that + ended in an open double quote was parsed with + a non-compat32 policy, accessing the username attribute of + the mailbox accessed through that header object would + result in an IndexError. It now correctly returns an empty + string as the result. + - gh-148370: configparser: prevent quadratic behavior when + a ParsingError is raised after a parser fails to parse + multiple lines. Patch by Bénédikt Tran. + - gh-148254: Use singular “sec” instead of “secs” in timeit + verbose output for consistency with other time units. + - gh-148192: email.generator.Generator._make_boundary could + fail to detect a duplicate boundary string if linesep was + not n. It now correctly detects boundary strings when + linesep is rn as well. + - gh-146313: Fix a deadlock in multiprocessing’s resource + tracker where the parent process could hang indefinitely in + os.waitpid() during interpreter shutdown if a child created + via os.fork() still held the resource tracker’s pipe open. + - gh-145831: Fix email.quoprimime.decode() leaving a stray \r + when eol='\r\n' by stripping the full eol string instead of + one character. + - gh-145105: Fix crash in csv reader when iterating with + a re-entrant iterator that calls next() on the same reader + from within __next__. + - gh-130750: Restore quoting of choices in argparse error + messages for improved clarity and consistency with + documentation. + - gh-105936: Attempting to mutate non-field attributes of + dataclasses with both frozen and slots being True now + raises FrozenInstanceError instead of TypeError. Their + non-dataclass subclasses can now freely mutate non-field + attributes, and the original non-slotted class can be + garbage collected. The fix also handles the case of an + empty __class__ cell on a function found within the class + (gh-148947). + - gh-142516: ssl: fix reference leaks in ssl.SSLContext + objects. Patch by Bénédikt Tran. + - gh-142831: Fix a crash in the json module where + a use-after-free could occur if the object being encoded is + modified during serialization. + - gh-140287: The asyncio REPL now handles exceptions when + executing PYTHONSTARTUP scripts. Patch by Bartosz Sławecki. + - gh-90949: Add + SetBillionLaughsAttackProtectionActivationThreshold() and + SetBillionLaughsAttackProtectionMaximumAmplification() to ++++ 51 more lines (skipped) ++++ between /work/SRC/openSUSE:Factory/python313/python313.changes ++++ and /work/SRC/openSUSE:Factory/.python313.new.24530/python313.changes Old: ---- CVE-2026-1502-reject-CRLF-HTTP-tunnel.patch CVE-2026-4786-webbrowser-open-action.patch CVE-2026-6019-Morsel-js_output.patch CVE-2026-6100-use-after-free-decompression.patch Python-3.13.13.tar.xz Python-3.13.13.tar.xz.sigstore New: ---- CVE-2025-15366-imap-ctrl-chars.patch CVE-2025-15366-pop3-ctrl-chars.patch CVE-2026-11940-tarfile-escape.patch Python-3.13.14.tar.xz Python-3.13.14.tar.xz.sigstore ----------(Old B)---------- Old:- Remove upstreamed patches: - CVE-2026-1502-reject-CRLF-HTTP-tunnel.patch - CVE-2026-4786-webbrowser-open-action.patch Old: - CVE-2026-1502-reject-CRLF-HTTP-tunnel.patch - CVE-2026-4786-webbrowser-open-action.patch - CVE-2026-6019-Morsel-js_output.patch Old: - CVE-2026-4786-webbrowser-open-action.patch - CVE-2026-6019-Morsel-js_output.patch - CVE-2026-6100-use-after-free-decompression.patch Old: - CVE-2026-6019-Morsel-js_output.patch - CVE-2026-6100-use-after-free-decompression.patch ----------(Old E)---------- ----------(New B)---------- New: (bsc#1257044, gh#python/cpython!143922) CVE-2025-15366-imap-ctrl-chars.patch New: (bsc#1257041) CVE-2025-15366-pop3-ctrl-chars.patch New: hardlink-extraction fallback (bsc#1268977) CVE-2026-11940-tarfile-escape.patch ----------(New E)---------- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python313.spec ++++++ --- /var/tmp/diff_new_pack.MNBVyi/_old 2026-07-22 19:01:15.545140904 +0200 +++ /var/tmp/diff_new_pack.MNBVyi/_new 2026-07-22 19:01:15.545140904 +0200 @@ -167,7 +167,7 @@ # _md5.cpython-38m-x86_64-linux-gnu.so %define dynlib() %{sitedir}/lib-dynload/%{1}.cpython-%{abi_tag}-%{archname}-%{_os}%{?_gnu}%{?armsuffix}.so Name: %{python_pkg_name}%{psuffix} -Version: 3.13.13 +Version: 3.13.14 %define tarversion %{version} %define tarname Python-%{tarversion} Release: 0 @@ -236,21 +236,18 @@ # PATCH-FIX-UPSTREAM pass-test_write_read_limited_history.patch bsc#[0-9]+ [email protected] # Fix readline history truncation when length is reduced Patch48: pass-test_write_read_limited_history.patch -# PATCH-FIX-UPSTREAM CVE-2026-6100-use-after-free-decompression.patch bsc#1262098 [email protected] -# NULL dangling pointer to avoid use-after-free error -Patch49: CVE-2026-6100-use-after-free-decompression.patch -# PATCH-FIX-UPSTREAM CVE-2026-4786-webbrowser-open-action.patch bsc#1262319 [email protected] -# Fix webbrowser %action substitution bypass of dash-prefix check -Patch50: CVE-2026-4786-webbrowser-open-action.patch -# PATCH-FIX-UPSTREAM CVE-2026-1502-reject-CRLF-HTTP-tunnel.patch bsc#1261969 [email protected] -# Reject CR/LF in HTTP tunnel request headers -Patch51: CVE-2026-1502-reject-CRLF-HTTP-tunnel.patch -# PATCH-FIX-UPSTREAM CVE-2026-6019-Morsel-js_output.patch bsc#1262654 [email protected] -# Base64-encode cookie values embedded in JS -Patch52: CVE-2026-6019-Morsel-js_output.patch # PATCH-FIX-OPENSUSE test_UDPLITE_support.patch gh#python/cpython#149078 [email protected] # improve testing of the presence of IPPROTO_UDPLITE support Patch53: test_UDPLITE_support.patch +# PATCH-FIX-UPSTREAM CVE-2025-15366-imap-ctrl-chars.patch bsc#1257044 [email protected] +# Reject control characters in wsgiref.headers.Headers +Patch54: CVE-2025-15366-imap-ctrl-chars.patch +# PATCH-FIX-UPSTREAM CVE-2025-15366-pop3-ctrl-chars.patch bsc#1257041 [email protected] +# Reject control characters in POP3 commands +Patch55: CVE-2025-15366-pop3-ctrl-chars.patch +# PATCH-FIX-UPSTREAM CVE-2026-11940-tarfile-escape.patch bsc#1268977 [email protected] +# Fix symlink escape via tarfile hardlink-extraction fallback +Patch56: CVE-2026-11940-tarfile-escape.patch #### END OF PATCHES BuildRequires: autoconf-archive BuildRequires: automake ++++++ CVE-2025-15366-imap-ctrl-chars.patch ++++++ >From 7485ee5e2cf81d3e5ad0d9c3be73cecd2ab4eec7 Mon Sep 17 00:00:00 2001 From: Seth Michael Larson <[email protected]> Date: Fri, 16 Jan 2026 10:54:09 -0600 Subject: [PATCH 1/2] Add 'test.support' fixture for C0 control characters --- Lib/imaplib.py | 4 +++- Lib/test/test_imaplib.py | 6 ++++++ Misc/NEWS.d/next/Security/2026-01-16-11-41-06.gh-issue-143921.AeCOor.rst | 1 + 3 files changed, 10 insertions(+), 1 deletion(-) Index: Python-3.13.14/Lib/imaplib.py =================================================================== --- Python-3.13.14.orig/Lib/imaplib.py 2026-07-02 23:48:31.095827517 +0200 +++ Python-3.13.14/Lib/imaplib.py 2026-07-02 23:48:47.033673195 +0200 @@ -132,7 +132,7 @@ # We compile these in _mode_xxx. _Literal = br'.*{(?P<size>\d+)}$' _Untagged_status = br'\* (?P<data>\d+) (?P<type>[A-Z-]+)( (?P<data2>.*))?' - +_control_chars = re.compile(b'[\x00-\x1F\x7F]') class IMAP4: @@ -1000,6 +1000,8 @@ if arg is None: continue if isinstance(arg, str): arg = bytes(arg, self._encoding) + if _control_chars.search(arg): + raise ValueError("Control characters not allowed in commands") data = data + b' ' + arg literal = self.literal Index: Python-3.13.14/Lib/test/test_imaplib.py =================================================================== --- Python-3.13.14.orig/Lib/test/test_imaplib.py 2026-07-02 23:48:32.624887170 +0200 +++ Python-3.13.14/Lib/test/test_imaplib.py 2026-07-03 00:05:01.535007334 +0200 @@ -558,6 +558,12 @@ self.assertEqual(data[0], b'Returned to authenticated state. (Success)') self.assertEqual(client.state, 'AUTH') + def test_control_characters(self): + client, _ = self._setup(SimpleIMAPHandler) + for c0 in support.control_characters_c0(): + with self.assertRaises(ValueError): + client.login(f'user{c0}', 'pass') + class NewIMAPTests(NewIMAPTestsMixin, unittest.TestCase): imap_class = imaplib.IMAP4 Index: Python-3.13.14/Misc/NEWS.d/next/Security/2026-01-16-11-41-06.gh-issue-143921.AeCOor.rst =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ Python-3.13.14/Misc/NEWS.d/next/Security/2026-01-16-11-41-06.gh-issue-143921.AeCOor.rst 2026-07-02 23:48:47.034881464 +0200 @@ -0,0 +1 @@ +Reject control characters in IMAP commands. ++++++ CVE-2025-15366-pop3-ctrl-chars.patch ++++++ >From b6f733b285b1c4f27dacb5c2e1f292c914e8b933 Mon Sep 17 00:00:00 2001 From: Seth Michael Larson <[email protected]> Date: Fri, 16 Jan 2026 10:54:09 -0600 Subject: [PATCH 1/2] Add 'test.support' fixture for C0 control characters --- Lib/poplib.py | 2 ++ Lib/test/test_poplib.py | 8 ++++++++ Misc/NEWS.d/next/Security/2026-01-16-11-43-47.gh-issue-143923.DuytMe.rst | 1 + 3 files changed, 11 insertions(+) Index: Python-3.13.14/Lib/poplib.py =================================================================== --- Python-3.13.14.orig/Lib/poplib.py 2026-07-04 11:00:17.557334328 +0200 +++ Python-3.13.14/Lib/poplib.py 2026-07-04 11:00:26.988664709 +0200 @@ -122,6 +122,8 @@ def _putcmd(self, line): if self._debugging: print('*cmd*', repr(line)) line = bytes(line, self.encoding) + if re.search(b'[\x00-\x1F\x7F]', line): + raise ValueError('Control characters not allowed in commands') self._putline(line) Index: Python-3.13.14/Lib/test/test_poplib.py =================================================================== --- Python-3.13.14.orig/Lib/test/test_poplib.py 2026-07-04 11:00:19.736602403 +0200 +++ Python-3.13.14/Lib/test/test_poplib.py 2026-07-04 11:02:51.276051492 +0200 @@ -17,6 +17,7 @@ from test.support import threading_helper from test.support import asynchat from test.support import asyncore +from test.support import control_characters_c0 from test.support.testcase import ExtraAssertions @@ -396,6 +397,13 @@ self.assertIsNone(self.client.sock) self.assertIsNone(self.client.file) + def test_control_characters(self): + for c0 in control_characters_c0(): + with self.assertRaises(ValueError): + self.client.user(f'user{c0}') + with self.assertRaises(ValueError): + self.client.pass_(f'{c0}pass') + @requires_ssl def test_stls_capa(self): capa = self.client.capa() Index: Python-3.13.14/Misc/NEWS.d/next/Security/2026-01-16-11-43-47.gh-issue-143923.DuytMe.rst =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ Python-3.13.14/Misc/NEWS.d/next/Security/2026-01-16-11-43-47.gh-issue-143923.DuytMe.rst 2026-07-04 11:00:26.989135797 +0200 @@ -0,0 +1 @@ +Reject control characters in POP3 commands. ++++++ CVE-2026-11940-tarfile-escape.patch ++++++ >From 41426f20172933a24c6b6d01f1b36e40e3913107 Mon Sep 17 00:00:00 2001 From: Stan Ulbrych <[email protected]> Date: Tue, 23 Jun 2026 14:31:38 +0100 Subject: [PATCH] gh-151558: Fix symlink escape via `tarfile` hardlink-extraction fallback (GH-151559) (cherry picked from commit 27dd970bf6b17ebca7c8ed486a40ab043ed7af8f) Co-authored-by: Stan Ulbrych <[email protected]> --- Lib/tarfile.py | 3 + Lib/test/test_tarfile.py | 24 ++++++++++ Misc/NEWS.d/next/Security/2026-06-10-13-08-19.gh-issue-151558.mL74i2.rst | 3 + 3 files changed, 30 insertions(+) create mode 100644 Misc/NEWS.d/next/Security/2026-06-10-13-08-19.gh-issue-151558.mL74i2.rst Index: Python-3.13.14/Lib/tarfile.py =================================================================== --- Python-3.13.14.orig/Lib/tarfile.py 2026-07-02 12:04:38.836547696 +0200 +++ Python-3.13.14/Lib/tarfile.py 2026-07-02 12:04:44.200884006 +0200 @@ -2718,6 +2718,9 @@ "makelink_with_filter: if filter_function is not None, " + "extraction_root must also not be None") try: + filter_function( + unfiltered.replace(name=tarinfo.name, deep=False), + extraction_root) filtered = filter_function(unfiltered, extraction_root) except _FILTER_ERRORS as cause: raise LinkFallbackError(tarinfo, unfiltered.name) from cause Index: Python-3.13.14/Lib/test/test_tarfile.py =================================================================== --- Python-3.13.14.orig/Lib/test/test_tarfile.py 2026-07-02 12:04:41.154985165 +0200 +++ Python-3.13.14/Lib/test/test_tarfile.py 2026-07-02 12:04:44.201864897 +0200 @@ -4312,6 +4312,30 @@ self.expect_file("c", symlink_to='b') @symlink_test + def test_sneaky_hardlink_fallback_deep(self): + # (CVE-2026-11940) + with ArchiveMaker() as arc: + arc.add("a/b/s", symlink_to=os.path.join("..", "escape")) + arc.add("s", hardlink_to=os.path.join("a", "b", "s")) + + with self.check_context(arc.open(), 'data'): + e = self.expect_exception( + tarfile.LinkFallbackError, + "link 's' would be extracted as a copy of " + + "'a/b/s', which was rejected") + self.assertIsInstance(e.__cause__, + tarfile.LinkOutsideDestinationError) + + for filter in 'tar', 'fully_trusted': + with self.subTest(filter), self.check_context(arc.open(), filter): + if not os_helper.can_symlink(): + self.expect_file("a/") + self.expect_file("a/b/") + else: + self.expect_file("a/b/s", symlink_to=os.path.join('..', 'escape')) + self.expect_file("s", symlink_to=os.path.join('..', 'escape')) + + @symlink_test def test_exfiltration_via_symlink(self): # (CVE-2025-4138) # Test changing symlinks that result in a symlink pointing outside Index: Python-3.13.14/Misc/NEWS.d/next/Security/2026-06-10-13-08-19.gh-issue-151558.mL74i2.rst =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ Python-3.13.14/Misc/NEWS.d/next/Security/2026-06-10-13-08-19.gh-issue-151558.mL74i2.rst 2026-07-02 12:04:44.202594053 +0200 @@ -0,0 +1,3 @@ +Fixed an vulnerability in the :mod:`tarfile` ``data`` and ``tar`` extraction +filters where crafted archives could create a symlink pointing outside the +destination directory. This was a bypass of :cve:`2025-4330`. ++++++ Python-3.13.13.tar.xz -> Python-3.13.14.tar.xz ++++++ /work/SRC/openSUSE:Factory/python313/Python-3.13.13.tar.xz /work/SRC/openSUSE:Factory/.python313.new.24530/Python-3.13.14.tar.xz differ: char 26, line 1 ++++++ Python-3.13.13.tar.xz.sigstore -> Python-3.13.14.tar.xz.sigstore ++++++ --- /work/SRC/openSUSE:Factory/python313/Python-3.13.13.tar.xz.sigstore 2026-04-15 16:03:04.067292054 +0200 +++ /work/SRC/openSUSE:Factory/.python313.new.24530/Python-3.13.14.tar.xz.sigstore 2026-07-22 19:01:13.041055270 +0200 @@ -1 +1 @@ -{"mediaType": "application/vnd.dev.sigstore.bundle.v0.3+json", "verificationMaterial": {"certificate": {"rawBytes": "MIICyDCCAk+gAwIBAgIUGhTZElG4g14FGuz+6tP4CD0f480wCgYIKoZIzj0EAwMwNzEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MR4wHAYDVQQDExVzaWdzdG9yZS1pbnRlcm1lZGlhdGUwHhcNMjYwNDA3MTgzODEwWhcNMjYwNDA3MTg0ODEwWjAAMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE/Qc+RtLG7yRaVOAhm1Wm+zXYpH9S/boHjV+yHTfk9C/UqWc4SDI9XJ3zA+CGKoy4XOw4d9u9j/YkjZJNKgfU1qOCAW4wggFqMA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzAdBgNVHQ4EFgQUNdSpYmLFcoz2dToGqp98EcVE1KYwHwYDVR0jBBgwFoAU39Ppz1YkEZb5qNjpKFWixi4YZD8wHwYDVR0RAQH/BBUwE4ERdGhvbWFzQHB5dGhvbi5vcmcwKQYKKwYBBAGDvzABAQQbaHR0cHM6Ly9hY2NvdW50cy5nb29nbGUuY29tMCsGCisGAQQBg78wAQgEHQwbaHR0cHM6Ly9hY2NvdW50cy5nb29nbGUuY29tMIGJBgorBgEEAdZ5AgQCBHsEeQB3AHUA3T0wasbHETJjGR4cmWc3AqJKXrjePK3/h4pygC8p7o4AAAGdaTzf4gAABAMARjBEAiBvhAoxdh0VK2ZCvGBwxjiXToc13f9+mc9ezYTrsSLoRQIgH9KkUMyL6TLjVzHnpgRyB0ACevhU5hkInN+DNYYIBVUwCgYIKoZIzj0EAwMDZwAwZAIwcllDR1P0VpUsPBs8W3wk6sAnCxYdP23AP/72rErpOtQd8j5gmpSiuRg1 +SrDLo+1AjAZlIoYqEqW8v5dDhH/Z3ZNLyG5lq0th5nu338m0KADcN8YBlURhFX0lQiem8Kkun0="}, "tlogEntries": [{"logIndex": "1247791401", "logId": {"keyId": "wNI9atQGlz+VWfO6LRygH4QUfY/8W4RFwiT5i5WRgB0="}, "kindVersion": {"kind": "hashedrekord", "version": "0.0.1"}, "integratedTime": "1775587090", "inclusionPromise": {"signedEntryTimestamp": "MEUCIQCqavWbun8W6P1n/kFij+NitMv2m/yws9t9pAo1AkkBIgIgFFXufZCRLRGdoJ65fQrjtRBO3YpokREE2CtjPlsWuu0="}, "inclusionProof": {"logIndex": "1125887139", "rootHash": "0rm3uuqoyrYsi+AXbNGa5udAq46B8sgFRTKm/M6WMuw=", "treeSize": "1125887147", "hashes": ["R3OMmIUDtZDiSJm+g0yQ78hUtG47J8i+tbkzqVDMAxQ=", "Q3h1kJ+pgjJfPKLoB+TjxtFZ/8ov1JUyCh2AEn764tw=", "RbNsabll24/HhRa6zejvIRd9jIPagbhQoSmPvhyIYPQ=", "HF2NxpwJQw+AqIufAVE94No7LazP7Q83IXVVAhHkiY4=", "UO11qu4hqF3BqyYqme50iQFdLbchLCMe5iOm4bSxycA=", "O8ieEqc3YlOI5vJWPMtvBg6wA0uXLJmrHoLK+ii7pM8=", "S7wW23Hi2t7r3I+x+4OMUwjHxixQ2xaX7kgK53e6XdM=", "HVg57mecLqZ7Ec7g6NZhVBswvv/1UrmzPrC1Syh1heI=", "RKd9pRFYAbptJPgYSU7hcwgveHw813ekidCp/W8W NdQ=", "daNcvQEzsG0zqEioC6u2KwTJy4oa9qT0adsp7LEOhFw=", "ifjNYQZhuKjhQr9LSmMHyaX9NeFNIdXuPzIVP5/1eA8=", "D7z1tETX/WvHSmZKT4M7w2y8pJ1HI4XtSf6OiM+h6UA=", "2v7+H4Fejl7qkIhG2G79UQH+wJ0QpPreOZwulFGWzLI=", "vXMaHYsu3vXUFKr78h1vCtaZWhgh1OwZh5O05RGwxkw=", "WbswTMpSfvjDqroD6lDGb2VDeljBPlMsAchJ+0L+3U4=", "psQ1PrYXqFtm6T3uF1q91rl1dhNiykO58GpOdq1ZaKI=", "DOCeoSMovIvLExkhIvisow9AuNXgeWs4ECkyR6EcqYU="], "checkpoint": {"envelope": "rekor.sigstore.dev - 1193050959916656506\n1125887147\n0rm3uuqoyrYsi+AXbNGa5udAq46B8sgFRTKm/M6WMuw=\n\n\u2014 rekor.sigstore.dev wNI9ajBEAiAZm2anwROK16iT7hjpwQok7s4uYW2HWTZWI1GbsDZrQgIgJMSOb98BfHfh3lubhDH7phUBLYD+b1lL6wXMih2SCKA=\n"}}, "canonicalizedBody": "eyJhcGlWZXJzaW9uIjoiMC4wLjEiLCJraW5kIjoiaGFzaGVkcmVrb3JkIiwic3BlYyI6eyJkYXRhIjp7Imhhc2giOnsiYWxnb3JpdGhtIjoic2hhMjU2IiwidmFsdWUiOiIyYWI5MWZmNDAxNzgzY2NjYTY0Zjc1ZDEwYzg4MmU5NTdiZGZkNjBlMmJmNWE3MmY4NDIxNzkzNzI5Yjc4YTcxIn19LCJzaWduYXR1cmUiOnsiY29udGVudCI6Ik1FVUNJUUNPSC9ZVnBmamVrcm5sby9JeFZWamtQWU4wK3h4N3BFVGk2ODJKMlA0My9n SWdOdHZhWGx2UWdheUZpUkxFMk9GZmtZT0c1eDA4dEI1VFR6Z0t6ci9Xd1B3PSIsInB1YmxpY0tleSI6eyJjb250ZW50IjoiTFMwdExTMUNSVWRKVGlCRFJWSlVTVVpKUTBGVVJTMHRMUzB0Q2sxSlNVTjVSRU5EUVdzclowRjNTVUpCWjBsVlIyaFVXa1ZzUnpSbk1UUkdSM1Y2S3paMFVEUkRSREJtTkRnd2QwTm5XVWxMYjFwSmVtb3dSVUYzVFhjS1RucEZWazFDVFVkQk1WVkZRMmhOVFdNeWJHNWpNMUoyWTIxVmRWcEhWakpOVWpSM1NFRlpSRlpSVVVSRmVGWjZZVmRrZW1SSE9YbGFVekZ3WW01U2JBcGpiVEZzV2tkc2FHUkhWWGRJYUdOT1RXcFpkMDVFUVROTlZHZDZUMFJGZDFkb1kwNU5hbGwzVGtSQk0wMVVaekJQUkVWM1YycEJRVTFHYTNkRmQxbElDa3R2V2tsNmFqQkRRVkZaU1V0dldrbDZhakJFUVZGalJGRm5RVVV2VVdNclVuUk1SemQ1VW1GV1QwRm9iVEZYYlN0NldGbHdTRGxUTDJKdlNHcFdLM2tLU0ZSbWF6bERMMVZ4VjJNMFUwUkpPVmhLTTNwQkswTkhTMjk1TkZoUGR6UmtPWFU1YWk5WmEycGFTazVMWjJaVk1YRlBRMEZYTkhkblowWnhUVUUwUndwQk1WVmtSSGRGUWk5M1VVVkJkMGxJWjBSQlZFSm5UbFpJVTFWRlJFUkJTMEpuWjNKQ1owVkdRbEZqUkVGNlFXUkNaMDVXU0ZFMFJVWm5VVlZPWkZOd0NsbHRURVpqYjNveVpGUnZSM0Z3T1RoRlkxWkZNVXRaZDBoM1dVUldVakJxUWtKbmQwWnZRVlV6T1ZCd2VqRlphMFZhWWpWeFRtcHdTMFpYYVhocE5Ga0tXa1E0ZDBoM1dVUldVakJTUVZGSUwwSkNWWGRGTkVWU 1pFZG9kbUpYUm5wUlNFSTFaRWRvZG1KcE5YWmpiV04zUzFGWlMwdDNXVUpDUVVkRWRucEJRZ3BCVVZGaVlVaFNNR05JVFRaTWVUbG9XVEpPZG1SWE5UQmplVFZ1WWpJNWJtSkhWWFZaTWpsMFRVTnpSME5wYzBkQlVWRkNaemM0ZDBGUlowVklVWGRpQ21GSVVqQmpTRTAyVEhrNWFGa3lUblprVnpVd1kzazFibUl5T1c1aVIxVjFXVEk1ZEUxSlIwcENaMjl5UW1kRlJVRmtXalZCWjFGRFFraHpSV1ZSUWpNS1FVaFZRVE5VTUhkaGMySklSVlJLYWtkU05HTnRWMk16UVhGS1MxaHlhbVZRU3pNdmFEUndlV2RET0hBM2J6UkJRVUZIWkdGVWVtWTBaMEZCUWtGTlFRcFNha0pGUVdsQ2RtaEJiM2hrYURCV1N6SmFRM1pIUW5kNGFtbFlWRzlqTVRObU9TdHRZemxsZWxsVWNuTlRURzlTVVVsblNEbExhMVZOZVV3MlZFeHFDbFo2U0c1d1oxSjVRakJCUTJWMmFGVTFhR3RKYms0clJFNVpXVWxDVmxWM1EyZFpTVXR2V2tsNmFqQkZRWGROUkZwM1FYZGFRVWwzWTJ4c1JGSXhVREFLVm5CVmMxQkNjemhYTTNkck5uTkJia040V1dSUU1qTkJVQzgzTW5KRmNuQlBkRkZrT0dvMVoyMXdVMmwxVW1jeEsxTnlSRXh2S3pGQmFrRmFiRWx2V1FweFJYRlhPSFkxWkVSb1NDOWFNMXBPVEhsSE5XeHhNSFJvTlc1MU16TTRiVEJMUVVSalRqaFpRbXhWVW1oR1dEQnNVV2xsYlRoTGEzVnVNRDBLTFMwdExTMUZUa1FnUTBWU1ZFbEdTVU5CVkVVdExTMHRMUW89In19fX0="}], "timestampVerificationData": {}}, "messageSignature": {"messa geDigest": {"algorithm": "SHA2_256", "digest": "Krkf9AF4PMymT3XRDIgulXvf1g4r9acvhCF5Nym3inE="}, "signature": "MEUCIQCOH/YVpfjekrnlo/IxVVjkPYN0+xx7pETi682J2P43/gIgNtvaXlvQgayFiRLE2OFfkYOG5x08tB5TTzgKzr/WwPw="}} +{"mediaType": "application/vnd.dev.sigstore.bundle.v0.3+json", "verificationMaterial": {"certificate": {"rawBytes": "MIIDKTCCAq6gAwIBAgIULAhuyOW9GotTtF956yFWVeMi9e0wCgYIKoZIzj0EAwMwNzEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MR4wHAYDVQQDExVzaWdzdG9yZS1pbnRlcm1lZGlhdGUwHhcNMjYwNjEwMTQyODI3WhcNMjYwNjEwMTQzODI3WjAAMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEdYYDPeIvTaNaA504q6KnotW24E+LnSxqZPcpE/YfmwdFx4MU67wyr5JHj+99vRiZRKu7nGGH/L/5Y2QCHXOweaOCAc0wggHJMA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzAdBgNVHQ4EFgQUtb9Anla5U+yJuuln4ag0E1Hvch4wHwYDVR0jBBgwFoAU39Ppz1YkEZb5qNjpKFWixi4YZD8wHwYDVR0RAQH/BBUwE4ERdGhvbWFzQHB5dGhvbi5vcmcwKQYKKwYBBAGDvzABAQQbaHR0cHM6Ly9hY2NvdW50cy5nb29nbGUuY29tMCsGCisGAQQBg78wAQgEHQwbaHR0cHM6Ly9hY2NvdW50cy5nb29nbGUuY29tMFsGCisGAQQBg78wARgETQxLQ2hVeE1UTXdNREkzTWpZek1UVXpOekkwT0RjNU1EVVNIMmgwZEhCek9pVXlSaVV5Um1GalkyOTFiblJ6TG1kdmIyZHNaUzVqYjIwMIGLBgorBgEEAdZ5AgQCBH0EewB5AHcA3T0wasbHETJjGR4cmWc3AqJKXrjePK3/h4pygC8p7o4AAAGese9CzwAABAMASDBGAiEAs3zEn9PTSTzbsiNMdcHWmnt/Tr7ohDOdN89wXghiplwC IQDKwEFCf+AVlV27FIJyZNxwcVRgoHMzZbbrtpQGeN6oNDAKBggqhkjOPQQDAwNpADBmAjEAxEU8IdjbodolTUvnyOpMSmD5m9r9vzoZvt5fMzhirAZkCkcP4OCvnE/ukJCa6idLAjEA6li+yZaiTaNX0BFBDOLXrvJyPoTnHkyQT9vRpcinxpvrIr6iLkfOAkaha2r4GyDF"}, "tlogEntries": [{"logIndex": "1780117219", "logId": {"keyId": "wNI9atQGlz+VWfO6LRygH4QUfY/8W4RFwiT5i5WRgB0="}, "kindVersion": {"kind": "hashedrekord", "version": "0.0.1"}, "integratedTime": "1781101708", "inclusionPromise": {"signedEntryTimestamp": "MEUCIFS+B+yf9aPd9Y4IygE8cH4o62r7ReqavjRkEf1fgl1LAiEA/CnXwPLUQPCuPlzM0FF7ZTulVNsK4BGrMQ5n4ee/OG8="}, "inclusionProof": {"logIndex": "1658212957", "rootHash": "sHzzFJN2XdaFugNII2SBFTwVL3gvpg/65Kkvy7XjVYg=", "treeSize": "1658212960", "hashes": ["fjIrcah9UCqvI/G3W/gXPbinx4y1XhfdJc2pBrp56Jk=", "8magWOn3O80eK3S9O3iABLjM2e7zcUYfYYILm0CsuEQ=", "FxZ3/KmO9r7RionmLoWqWTG9XHLypgnUMe/8G02U9lg=", "yg472o3t6Dgh2OPS58tqIU3T25ysLLoP/mTqE1OOMMg=", "AxE/Wo8YToTK9SmFomPMJyNXKaOUE2O9lckgoXcg6vA=", "oI154gwGbnn3ycvQKnadlb+taKCtItyR60doRasTk9Y=", "tOVkANwP imLhfqQTm4pls4RGQEUFpz2eAQ3OdicZz8Q=", "b433dsxcmrTWUBI2JbGCjLyy7Pr0IBBMn19dgt3Io4M=", "wOKx0z9QYCh6V91tGPBC6wLftogdim0At1wEeYZQHbo=", "lopYNMPEeyiDfEtpMLlLnbKMdVRShbMH7EYpd/6Z2zQ=", "GKETua1skk2MkOa2eEP3m0xGCLMYojSBY14Q+YigFHA=", "GQOQCyMMlUdewn4btkfMBkpDJPWuNcETDxHWpbp+iKw=", "phbrqVrscGmqV5frx3cP3FZg0R9d16flgXnmF8YlBJs=", "JeFJuYar3D4uBzvMd7x3qts+CGhYQOGMaAiiYVFCxto=", "mDCdA8t/LGc+hqiV0SOyqPXlOYPyWpasRaDDvCC8JAE=", "daxmZaajRpZV+JxHiOYZhJBiSKN5ucqjh2WnGbHhirw=", "DOCeoSMovIvLExkhIvisow9AuNXgeWs4ECkyR6EcqYU="], "checkpoint": {"envelope": "rekor.sigstore.dev - 1193050959916656506\n1658212960\nsHzzFJN2XdaFugNII2SBFTwVL3gvpg/65Kkvy7XjVYg=\n\n\u2014 rekor.sigstore.dev wNI9ajBEAiAq1Bjp86Om5pWj3l+M1byA+TB4kRDCXH08p+zrADhGngIgPNoGamj5tOIr4mM9r3AcgeIRFLr4uRBUJaZcP+YAacc=\n"}}, "canonicalizedBody": "eyJhcGlWZXJzaW9uIjoiMC4wLjEiLCJraW5kIjoiaGFzaGVkcmVrb3JkIiwic3BlYyI6eyJkYXRhIjp7Imhhc2giOnsiYWxnb3JpdGhtIjoic2hhMjU2IiwidmFsdWUiOiI2MzllNDMyNDNjNjIwYTMwOGY5NjgyMTNkZjllMDBmMmY4ZjYyMzMyZjdhZGJh YTdhN2VlYjk3ODMwNTdjNjkwIn19LCJzaWduYXR1cmUiOnsiY29udGVudCI6Ik1FUUNJRDMrWDcwUWJ5allDanllWDBkdkQ1czdwc3ZtRm4zN1lwWG4vcjRqZHBUMEFpQmtzU25QM1M0QTB0YmN4NjNTTFpTWVdWME1tUkNOVXI3eE8xMkZxTlJEVmc9PSIsInB1YmxpY0tleSI6eyJjb250ZW50IjoiTFMwdExTMUNSVWRKVGlCRFJWSlVTVVpKUTBGVVJTMHRMUzB0Q2sxSlNVUkxWRU5EUVhFMlowRjNTVUpCWjBsVlRFRm9kWGxQVnpsSGIzUlVkRVk1TlRaNVJsZFdaVTFwT1dVd2QwTm5XVWxMYjFwSmVtb3dSVUYzVFhjS1RucEZWazFDVFVkQk1WVkZRMmhOVFdNeWJHNWpNMUoyWTIxVmRWcEhWakpOVWpSM1NFRlpSRlpSVVVSRmVGWjZZVmRrZW1SSE9YbGFVekZ3WW01U2JBcGpiVEZzV2tkc2FHUkhWWGRJYUdOT1RXcFpkMDVxUlhkTlZGRjVUMFJKTTFkb1kwNU5hbGwzVG1wRmQwMVVVWHBQUkVrelYycEJRVTFHYTNkRmQxbElDa3R2V2tsNmFqQkRRVkZaU1V0dldrbDZhakJFUVZGalJGRm5RVVZrV1ZsRVVHVkpkbFJoVG1GQk5UQTBjVFpMYm05MFZ6STBSU3RNYmxONGNWcFFZM0FLUlM5WlptMTNaRVo0TkUxVk5qZDNlWEkxU2tocUt6azVkbEpwV2xKTGRUZHVSMGRJTDB3dk5Wa3lVVU5JV0U5M1pXRlBRMEZqTUhkblowaEtUVUUwUndwQk1WVmtSSGRGUWk5M1VVVkJkMGxJWjBSQlZFSm5UbFpJVTFWRlJFUkJTMEpuWjNKQ1owVkdRbEZqUkVGNlFXUkNaMDVXU0ZFMFJVWm5VVlYwWWpsQkNtNXNZVFZWSzNsS2RYVnNialJoWnpCR k1VaDJZMmcwZDBoM1dVUldVakJxUWtKbmQwWnZRVlV6T1ZCd2VqRlphMFZhWWpWeFRtcHdTMFpYYVhocE5Ga0tXa1E0ZDBoM1dVUldVakJTUVZGSUwwSkNWWGRGTkVWU1pFZG9kbUpYUm5wUlNFSTFaRWRvZG1KcE5YWmpiV04zUzFGWlMwdDNXVUpDUVVkRWRucEJRZ3BCVVZGaVlVaFNNR05JVFRaTWVUbG9XVEpPZG1SWE5UQmplVFZ1WWpJNWJtSkhWWFZaTWpsMFRVTnpSME5wYzBkQlVWRkNaemM0ZDBGUlowVklVWGRpQ21GSVVqQmpTRTAyVEhrNWFGa3lUblprVnpVd1kzazFibUl5T1c1aVIxVjFXVEk1ZEUxR2MwZERhWE5IUVZGUlFtYzNPSGRCVW1kRlZGRjRURkV5YUZZS1pVVXhWVlJZWkU1U1JXdDZWRmR3V21Wck1WVldXSEJQWld0cmQxUXdVbXBPVlRGRlZsWk9TVTF0WjNkYVJXaERaV3M1Y0ZaWWJGTmhWbFkxVlcweFJ3cGhiR3Q1VDFSR2FXSnNTalpVUnpGclpHMUplVnBJVG1GVmVsWnhXV3BKZDAxSlIweENaMjl5UW1kRlJVRmtXalZCWjFGRFFrZ3dSV1YzUWpWQlNHTkJDak5VTUhkaGMySklSVlJLYWtkU05HTnRWMk16UVhGS1MxaHlhbVZRU3pNdmFEUndlV2RET0hBM2J6UkJRVUZIWlhObE9VTjZkMEZCUWtGTlFWTkVRa2NLUVdsRlFYTXpla1Z1T1ZCVVUxUjZZbk5wVGsxa1kwaFhiVzUwTDFSeU4yOW9SRTlrVGpnNWQxaG5hR2x3YkhkRFNWRkVTM2RGUmtObUswRldiRll5TndwR1NVcDVXazU0ZDJOV1VtZHZTRTE2V21KaWNuUndVVWRsVGpadlRrUkJTMEpuWjNGb2EycFBVRkZSUkVGM1RuQkJSRUp0UVdwRlFYaE ZWVGhKWkdwaUNtOWtiMnhVVlhadWVVOXdUVk50UkRWdE9YSTVkbnB2V25aME5XWk5lbWhwY2tGYWEwTnJZMUEwVDBOMmJrVXZkV3RLUTJFMmFXUk1RV3BGUVRac2FTc0tlVnBoYVZSaFRsZ3dRa1pDUkU5TVdISjJTbmxRYjFSdVNHdDVVVlE1ZGxKd1kybHVlSEIyY2tseU5tbE1hMlpQUVd0aGFHRXljalJIZVVSR0NpMHRMUzB0UlU1RUlFTkZVbFJKUmtsRFFWUkZMUzB0TFMwSyJ9fX19"}], "timestampVerificationData": {}}, "messageSignature": {"messageDigest": {"algorithm": "SHA2_256", "digest": "Y55DJDxiCjCPloIT354A8vj2IzL3rbqnp+65eDBXxpA="}, "signature": "MEQCID3+X70QbyjYCjyeX0dvD5s7psvmFn37YpXn/r4jdpT0AiBksSnP3S4A0tbcx63SLZSYWV0MmRCNUr7xO12FqNRDVg=="}} ++++++ _scmsync.obsinfo ++++++ --- /var/tmp/diff_new_pack.MNBVyi/_old 2026-07-22 19:01:15.745147743 +0200 +++ /var/tmp/diff_new_pack.MNBVyi/_new 2026-07-22 19:01:15.753148017 +0200 @@ -1,6 +1,6 @@ -mtime: 1781393469 -commit: eb6e39cdf99d0e2e3905f3ad6c5560ea993140e4e9a52c2ee9e440a54817261c +mtime: 1784282806 +commit: 231e2440e2990865abbe4e28761b76d134fc48b59de16e0a1f93c13ed00e4c59 url: https://src.opensuse.org/python-interpreters/python313 -revision: eb6e39cdf99d0e2e3905f3ad6c5560ea993140e4e9a52c2ee9e440a54817261c +revision: 231e2440e2990865abbe4e28761b76d134fc48b59de16e0a1f93c13ed00e4c59 projectscmsync: https://src.opensuse.org/python-interpreters/_ObsPrj ++++++ build.specials.obscpio ++++++ ++++++ build.specials.obscpio ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/.gitignore new/.gitignore --- old/.gitignore 1970-01-01 01:00:00.000000000 +0100 +++ new/.gitignore 2026-07-17 12:06:46.000000000 +0200 @@ -0,0 +1,6 @@ +.osc +*.obscpio +*.osc +_build.* +.pbuild +python313-*-build/ ++++++ doc-py38-to-py36.patch ++++++ --- /var/tmp/diff_new_pack.MNBVyi/_old 2026-07-22 19:01:15.937154309 +0200 +++ /var/tmp/diff_new_pack.MNBVyi/_new 2026-07-22 19:01:15.937154309 +0200 @@ -27,10 +27,10 @@ Doc/tools/extensions/pydoc_topics.py | 22 +++++----- 18 files changed, 159 insertions(+), 130 deletions(-) -Index: Python-3.13.12/Doc/Makefile +Index: Python-3.13.14/Doc/Makefile =================================================================== ---- Python-3.13.12.orig/Doc/Makefile 2026-02-03 18:53:27.000000000 +0100 -+++ Python-3.13.12/Doc/Makefile 2026-02-06 11:32:43.257524049 +0100 +--- Python-3.13.14.orig/Doc/Makefile 2026-06-10 14:24:04.000000000 +0200 ++++ Python-3.13.14/Doc/Makefile 2026-06-17 15:09:20.086496688 +0200 @@ -14,15 +14,15 @@ SOURCES = DISTVERSION = $(shell $(PYTHON) tools/extensions/patchlevel.py) @@ -51,10 +51,10 @@ $(PAPEROPT_$(PAPER)) \ $(SPHINXOPTS) $(SPHINXERRORHANDLING) \ . build/$(BUILDER) $(SOURCES) -Index: Python-3.13.12/Doc/c-api/arg.rst +Index: Python-3.13.14/Doc/c-api/arg.rst =================================================================== ---- Python-3.13.12.orig/Doc/c-api/arg.rst 2026-02-03 18:53:27.000000000 +0100 -+++ Python-3.13.12/Doc/c-api/arg.rst 2026-02-06 11:32:43.257960130 +0100 +--- Python-3.13.14.orig/Doc/c-api/arg.rst 2026-06-10 14:24:04.000000000 +0200 ++++ Python-3.13.14/Doc/c-api/arg.rst 2026-06-17 15:09:20.086830417 +0200 @@ -334,7 +334,6 @@ should raise an exception and leave the content of *address* unmodified. @@ -63,20 +63,20 @@ If the *converter* returns :c:macro:`!Py_CLEANUP_SUPPORTED`, it may get called a second time if the argument parsing eventually fails, giving the converter a -Index: Python-3.13.12/Doc/c-api/typeobj.rst +Index: Python-3.13.14/Doc/c-api/typeobj.rst =================================================================== ---- Python-3.13.12.orig/Doc/c-api/typeobj.rst 2026-02-03 18:53:27.000000000 +0100 -+++ Python-3.13.12/Doc/c-api/typeobj.rst 2026-02-06 11:32:43.258653093 +0100 +--- Python-3.13.14.orig/Doc/c-api/typeobj.rst 2026-06-10 14:24:04.000000000 +0200 ++++ Python-3.13.14/Doc/c-api/typeobj.rst 2026-06-17 15:10:19.774250769 +0200 @@ -610,7 +610,7 @@ Functions like :c:func:`PyObject_NewVar` will take the value of N as an argument, and store in the instance's :c:member:`~PyVarObject.ob_size` field. Note that the :c:member:`~PyVarObject.ob_size` field may later be used for - other purposes. For example, :py:type:`int` instances use the bits of + other purposes. For example, :py:obj:`int` instances use the bits of - :c:member:`~PyVarObject.ob_size` in an implementation-defined - way; the underlying storage and its size should be accessed using - :c:func:`PyLong_Export`. -@@ -622,9 +622,9 @@ + :c:member:`~PyVarObject.ob_size` in an implementation-defined way. + + .. note:: +@@ -620,9 +620,9 @@ Also, the presence of an :c:member:`~PyVarObject.ob_size` field in the instance layout doesn't mean that the instance structure is variable-length. @@ -88,7 +88,7 @@ Call :c:func:`PyList_Size` instead.) The :c:member:`!tp_basicsize` includes size needed for data of the type's -@@ -637,7 +637,7 @@ +@@ -635,7 +635,7 @@ In other words, :c:member:`!tp_basicsize` must be greater than or equal to the base's :c:member:`!tp_basicsize`. @@ -97,12 +97,12 @@ include :c:type:`PyObject` or :c:type:`PyVarObject` (depending on whether :c:member:`~PyVarObject.ob_size` should be included). These are usually defined by the macro :c:macro:`PyObject_HEAD` or -Index: Python-3.13.12/Doc/conf.py +Index: Python-3.13.14/Doc/conf.py =================================================================== ---- Python-3.13.12.orig/Doc/conf.py 2026-02-06 11:32:20.252483695 +0100 -+++ Python-3.13.12/Doc/conf.py 2026-02-06 11:32:43.259159426 +0100 -@@ -11,6 +11,8 @@ - from importlib import import_module +--- Python-3.13.14.orig/Doc/conf.py 2026-06-17 15:09:02.614245675 +0200 ++++ Python-3.13.14/Doc/conf.py 2026-06-17 15:09:20.087949096 +0200 +@@ -10,6 +10,8 @@ + import sys from importlib.util import find_spec +from sphinx import version_info @@ -110,7 +110,7 @@ # Make our custom extensions available to Sphinx sys.path.append(os.path.abspath('tools/extensions')) sys.path.append(os.path.abspath('includes')) -@@ -57,11 +59,11 @@ +@@ -56,11 +58,11 @@ import _tkinter except ImportError: _tkinter = None @@ -136,7 +136,7 @@ # Create table of contents entries for domain objects (e.g. functions, classes, # attributes, etc.). Default is True. -@@ -246,6 +248,9 @@ +@@ -247,6 +249,9 @@ # Avoid a warning with Sphinx >= 4.0 root_doc = 'contents' @@ -146,7 +146,7 @@ # Allow translation of index directives gettext_additional_targets = [ 'index', -@@ -285,7 +290,7 @@ +@@ -286,7 +291,7 @@ # (See .readthedocs.yml and https://docs.readthedocs.io/en/stable/reference/environment-variables.html) is_deployment_preview = os.getenv("READTHEDOCS_VERSION_TYPE") == "external" repository_url = os.getenv("READTHEDOCS_GIT_CLONE_URL", "") @@ -155,7 +155,7 @@ html_context = { "is_deployment_preview": is_deployment_preview, "repository_url": repository_url or None, -@@ -551,6 +556,16 @@ +@@ -562,6 +567,16 @@ } extlinks_detect_hardcoded_links = True @@ -172,10 +172,10 @@ # Options for c_annotations extension # ----------------------------------- -Index: Python-3.13.12/Doc/library/doctest.rst +Index: Python-3.13.14/Doc/library/doctest.rst =================================================================== ---- Python-3.13.12.orig/Doc/library/doctest.rst 2026-02-03 18:53:27.000000000 +0100 -+++ Python-3.13.12/Doc/library/doctest.rst 2026-02-06 11:32:43.259497242 +0100 +--- Python-3.13.14.orig/Doc/library/doctest.rst 2026-06-10 14:24:04.000000000 +0200 ++++ Python-3.13.14/Doc/library/doctest.rst 2026-06-17 15:09:20.088259281 +0200 @@ -310,7 +310,6 @@ .. currentmodule:: None @@ -184,10 +184,10 @@ .. currentmodule:: doctest -Index: Python-3.13.12/Doc/library/email.compat32-message.rst +Index: Python-3.13.14/Doc/library/email.compat32-message.rst =================================================================== ---- Python-3.13.12.orig/Doc/library/email.compat32-message.rst 2026-02-03 18:53:27.000000000 +0100 -+++ Python-3.13.12/Doc/library/email.compat32-message.rst 2026-02-06 11:32:43.259906983 +0100 +--- Python-3.13.14.orig/Doc/library/email.compat32-message.rst 2026-06-10 14:24:04.000000000 +0200 ++++ Python-3.13.14/Doc/library/email.compat32-message.rst 2026-06-17 15:09:20.088601737 +0200 @@ -7,7 +7,6 @@ :synopsis: The base class representing email messages in a fashion backward compatible with Python 3.2 @@ -196,10 +196,10 @@ The :class:`Message` class is very similar to the -Index: Python-3.13.12/Doc/library/xml.etree.elementtree.rst +Index: Python-3.13.14/Doc/library/xml.etree.elementtree.rst =================================================================== ---- Python-3.13.12.orig/Doc/library/xml.etree.elementtree.rst 2026-02-03 18:53:27.000000000 +0100 -+++ Python-3.13.12/Doc/library/xml.etree.elementtree.rst 2026-02-06 11:32:43.260169777 +0100 +--- Python-3.13.14.orig/Doc/library/xml.etree.elementtree.rst 2026-06-10 14:24:04.000000000 +0200 ++++ Python-3.13.14/Doc/library/xml.etree.elementtree.rst 2026-06-17 15:09:20.088861807 +0200 @@ -873,7 +873,6 @@ .. module:: xml.etree.ElementTree @@ -208,10 +208,10 @@ .. class:: Element(tag, attrib={}, **extra) -Index: Python-3.13.12/Doc/tools/check-warnings.py +Index: Python-3.13.14/Doc/tools/check-warnings.py =================================================================== ---- Python-3.13.12.orig/Doc/tools/check-warnings.py 2026-02-03 18:53:27.000000000 +0100 -+++ Python-3.13.12/Doc/tools/check-warnings.py 2026-02-06 11:32:43.260451727 +0100 +--- Python-3.13.14.orig/Doc/tools/check-warnings.py 2026-06-10 14:24:04.000000000 +0200 ++++ Python-3.13.14/Doc/tools/check-warnings.py 2026-06-17 15:09:20.089140552 +0200 @@ -228,7 +228,8 @@ print(filename) for warning in warnings: @@ -231,10 +231,10 @@ for warning in warnings if "Doc/" in warning } -Index: Python-3.13.12/Doc/tools/extensions/audit_events.py +Index: Python-3.13.14/Doc/tools/extensions/audit_events.py =================================================================== ---- Python-3.13.12.orig/Doc/tools/extensions/audit_events.py 2026-02-03 18:53:27.000000000 +0100 -+++ Python-3.13.12/Doc/tools/extensions/audit_events.py 2026-02-06 11:32:43.260742655 +0100 +--- Python-3.13.14.orig/Doc/tools/extensions/audit_events.py 2026-06-10 14:24:04.000000000 +0200 ++++ Python-3.13.14/Doc/tools/extensions/audit_events.py 2026-06-17 15:09:20.089399701 +0200 @@ -1,9 +1,6 @@ """Support for documenting audit events.""" @@ -370,10 +370,10 @@ ) -> nodes.row: row = nodes.row() name_node = nodes.paragraph("", nodes.Text(name)) -Index: Python-3.13.12/Doc/tools/extensions/availability.py +Index: Python-3.13.14/Doc/tools/extensions/availability.py =================================================================== ---- Python-3.13.12.orig/Doc/tools/extensions/availability.py 2026-02-03 18:53:27.000000000 +0100 -+++ Python-3.13.12/Doc/tools/extensions/availability.py 2026-02-06 11:32:43.260981454 +0100 +--- Python-3.13.14.orig/Doc/tools/extensions/availability.py 2026-06-10 14:24:04.000000000 +0200 ++++ Python-3.13.14/Doc/tools/extensions/availability.py 2026-06-17 15:09:20.089618053 +0200 @@ -1,8 +1,6 @@ """Support for documenting platform availability""" @@ -427,10 +427,10 @@ app.add_directive("availability", Availability) return { -Index: Python-3.13.12/Doc/tools/extensions/c_annotations.py +Index: Python-3.13.14/Doc/tools/extensions/c_annotations.py =================================================================== ---- Python-3.13.12.orig/Doc/tools/extensions/c_annotations.py 2026-02-03 18:53:27.000000000 +0100 -+++ Python-3.13.12/Doc/tools/extensions/c_annotations.py 2026-02-06 11:32:43.261164228 +0100 +--- Python-3.13.14.orig/Doc/tools/extensions/c_annotations.py 2026-06-10 14:24:04.000000000 +0200 ++++ Python-3.13.14/Doc/tools/extensions/c_annotations.py 2026-06-17 15:09:20.089797411 +0200 @@ -9,22 +9,26 @@ * Set ``stable_abi_file`` to the path to stable ABI list. """ @@ -569,10 +569,10 @@ return { "version": "1.0", "parallel_read_safe": True, -Index: Python-3.13.12/Doc/tools/extensions/changes.py +Index: Python-3.13.14/Doc/tools/extensions/changes.py =================================================================== ---- Python-3.13.12.orig/Doc/tools/extensions/changes.py 2026-02-03 18:53:27.000000000 +0100 -+++ Python-3.13.12/Doc/tools/extensions/changes.py 2026-02-06 11:32:43.261401915 +0100 +--- Python-3.13.14.orig/Doc/tools/extensions/changes.py 2026-06-10 14:24:04.000000000 +0200 ++++ Python-3.13.14/Doc/tools/extensions/changes.py 2026-06-17 15:09:20.089988751 +0200 @@ -1,7 +1,5 @@ """Support for documenting version of changes, additions, deprecations.""" @@ -608,10 +608,10 @@ # Override Sphinx's directives with support for 'next' app.add_directive("versionadded", PyVersionChange, override=True) app.add_directive("versionchanged", PyVersionChange, override=True) -Index: Python-3.13.12/Doc/tools/extensions/glossary_search.py +Index: Python-3.13.14/Doc/tools/extensions/glossary_search.py =================================================================== ---- Python-3.13.12.orig/Doc/tools/extensions/glossary_search.py 2026-02-03 18:53:27.000000000 +0100 -+++ Python-3.13.12/Doc/tools/extensions/glossary_search.py 2026-02-06 11:32:43.261561375 +0100 +--- Python-3.13.14.orig/Doc/tools/extensions/glossary_search.py 2026-06-10 14:24:04.000000000 +0200 ++++ Python-3.13.14/Doc/tools/extensions/glossary_search.py 2026-06-17 15:09:20.090137722 +0200 @@ -1,21 +1,27 @@ """Feature search results for glossary items prominently.""" @@ -655,10 +655,10 @@ app.connect('doctree-resolved', process_glossary_nodes) app.connect('build-finished', write_glossary_json) -Index: Python-3.13.12/Doc/tools/extensions/implementation_detail.py +Index: Python-3.13.14/Doc/tools/extensions/implementation_detail.py =================================================================== ---- Python-3.13.12.orig/Doc/tools/extensions/implementation_detail.py 2026-02-03 18:53:27.000000000 +0100 -+++ Python-3.13.12/Doc/tools/extensions/implementation_detail.py 2026-02-06 11:32:43.261759899 +0100 +--- Python-3.13.14.orig/Doc/tools/extensions/implementation_detail.py 2026-06-10 14:24:04.000000000 +0200 ++++ Python-3.13.14/Doc/tools/extensions/implementation_detail.py 2026-06-17 15:09:20.090286132 +0200 @@ -1,17 +1,10 @@ """Support for marking up implementation details.""" @@ -709,10 +709,10 @@ app.add_directive("impl-detail", ImplementationDetail) return { -Index: Python-3.13.12/Doc/tools/extensions/issue_role.py +Index: Python-3.13.14/Doc/tools/extensions/issue_role.py =================================================================== ---- Python-3.13.12.orig/Doc/tools/extensions/issue_role.py 2026-02-03 18:53:27.000000000 +0100 -+++ Python-3.13.12/Doc/tools/extensions/issue_role.py 2026-02-06 11:32:43.261920641 +0100 +--- Python-3.13.14.orig/Doc/tools/extensions/issue_role.py 2026-06-10 14:24:04.000000000 +0200 ++++ Python-3.13.14/Doc/tools/extensions/issue_role.py 2026-06-17 15:09:20.090431937 +0200 @@ -1,22 +1,18 @@ """Support for referencing issues in the tracker.""" @@ -758,10 +758,10 @@ app.add_role("issue", BPOIssue()) app.add_role("gh", GitHubIssue()) -Index: Python-3.13.12/Doc/tools/extensions/misc_news.py +Index: Python-3.13.14/Doc/tools/extensions/misc_news.py =================================================================== ---- Python-3.13.12.orig/Doc/tools/extensions/misc_news.py 2026-02-03 18:53:27.000000000 +0100 -+++ Python-3.13.12/Doc/tools/extensions/misc_news.py 2026-02-06 11:32:43.262085421 +0100 +--- Python-3.13.14.orig/Doc/tools/extensions/misc_news.py 2026-06-10 14:24:04.000000000 +0200 ++++ Python-3.13.14/Doc/tools/extensions/misc_news.py 2026-06-17 15:09:20.090610033 +0200 @@ -1,7 +1,5 @@ """Support for including Misc/NEWS.""" @@ -814,10 +814,10 @@ app.add_directive("miscnews", MiscNews) return { -Index: Python-3.13.12/Doc/tools/extensions/patchlevel.py +Index: Python-3.13.14/Doc/tools/extensions/patchlevel.py =================================================================== ---- Python-3.13.12.orig/Doc/tools/extensions/patchlevel.py 2026-02-03 18:53:27.000000000 +0100 -+++ Python-3.13.12/Doc/tools/extensions/patchlevel.py 2026-02-06 11:32:43.262245612 +0100 +--- Python-3.13.14.orig/Doc/tools/extensions/patchlevel.py 2026-06-10 14:24:04.000000000 +0200 ++++ Python-3.13.14/Doc/tools/extensions/patchlevel.py 2026-06-17 15:09:20.090806974 +0200 @@ -3,7 +3,7 @@ import re import sys @@ -855,10 +855,10 @@ version = f"{info.major}.{info.minor}" release = f"{info.major}.{info.minor}.{info.micro}" if info.releaselevel != "final": -Index: Python-3.13.12/Doc/tools/extensions/pydoc_topics.py +Index: Python-3.13.14/Doc/tools/extensions/pydoc_topics.py =================================================================== ---- Python-3.13.12.orig/Doc/tools/extensions/pydoc_topics.py 2026-02-03 18:53:27.000000000 +0100 -+++ Python-3.13.12/Doc/tools/extensions/pydoc_topics.py 2026-02-06 11:32:43.262420171 +0100 +--- Python-3.13.14.orig/Doc/tools/extensions/pydoc_topics.py 2026-06-10 14:24:04.000000000 +0200 ++++ Python-3.13.14/Doc/tools/extensions/pydoc_topics.py 2026-06-17 15:09:20.090958359 +0200 @@ -1,21 +1,23 @@ """Support for building "topic help" for pydoc.""" ++++++ gh139257-Support-docutils-0.22.patch ++++++ --- /var/tmp/diff_new_pack.MNBVyi/_old 2026-07-22 19:01:15.977155677 +0200 +++ /var/tmp/diff_new_pack.MNBVyi/_new 2026-07-22 19:01:15.981155814 +0200 @@ -4,14 +4,14 @@ Subject: [PATCH 1/2] gh-139257: Support docutils >= 0.22 --- - Doc/tools/extensions/pyspecific.py | 69 +++++++++++++++++++++++++------------ - 1 file changed, 47 insertions(+), 22 deletions(-) + Doc/tools/extensions/pyspecific.py | 57 +++++++++++++++++++++++++------------ + 1 file changed, 40 insertions(+), 17 deletions(-) -Index: Python-3.13.11/Doc/tools/extensions/pyspecific.py +Index: Python-3.13.14/Doc/tools/extensions/pyspecific.py =================================================================== ---- Python-3.13.11.orig/Doc/tools/extensions/pyspecific.py 2025-12-05 17:06:33.000000000 +0100 -+++ Python-3.13.11/Doc/tools/extensions/pyspecific.py 2025-12-18 23:38:44.804668556 +0100 -@@ -1,12 +1,12 @@ +--- Python-3.13.14.orig/Doc/tools/extensions/pyspecific.py 2026-06-10 14:24:04.000000000 +0200 ++++ Python-3.13.14/Doc/tools/extensions/pyspecific.py 2026-06-17 15:12:29.013047826 +0200 +@@ -1,20 +1,38 @@ # -*- coding: utf-8 -*- """ - pyspecific.py @@ -29,14 +29,12 @@ """ import re -@@ -22,30 +22,50 @@ - from sphinx.util.docutils import SphinxDirective - # Used in conf.py and updated here by python/release-tools/run_release.py --SOURCE_URI = 'https://github.com/python/cpython/tree/3.13/%s' -+SOURCE_URI = "https://github.com/python/cpython/tree/3.13/%s" -+ -+ ++from docutils.parsers.rst.states import Body + from sphinx import addnodes + from sphinx.domains.python import PyFunction, PyMethod + + +# monkey-patch reST parser to disable alphabetic and roman enumerated lists +def _disable_alphabetic_and_roman(text): + try: @@ -49,43 +47,15 @@ + return None + + -+from docutils.parsers.rst.states import Body -+ +Body.enum.converters["loweralpha"] = Body.enum.converters["upperalpha"] = ( + Body.enum.converters["lowerroman"] +) = Body.enum.converters["upperroman"] = _disable_alphabetic_and_roman + - ++ class PyAwaitableMixin(object): def handle_signature(self, sig, signode): ret = super(PyAwaitableMixin, self).handle_signature(sig, signode) -- signode.insert(0, addnodes.desc_annotation('awaitable ', 'awaitable ')) -+ signode.insert(0, addnodes.desc_annotation("awaitable ", "awaitable ")) - return ret - - - class PyAwaitableFunction(PyAwaitableMixin, PyFunction): - def run(self): -- self.name = 'py:function' -+ self.name = "py:function" - return PyFunction.run(self) - - - class PyAwaitableMethod(PyAwaitableMixin, PyMethod): - def run(self): -- self.name = 'py:method' -+ self.name = "py:method" - return PyMethod.run(self) - - - # Support for documenting Opcodes - --opcode_sig_re = re.compile(r'(\w+(?:\+\d)?)(?:\s*\((.*)\))?') -+opcode_sig_re = re.compile(r"(\w+(?:\+\d)?)(?:\s*\((.*)\))?") - - - def parse_opcode_signature(env, sig, signode): -@@ -64,7 +84,7 @@ +@@ -55,7 +73,7 @@ # Support for documenting pdb commands @@ -94,7 +64,7 @@ # later... # pdbargs_tokens_re = re.compile(r'''[a-zA-Z]+ | # identifiers -@@ -80,16 +100,16 @@ +@@ -71,16 +89,16 @@ if m is None: raise ValueError name, args = m.groups() @@ -114,7 +84,7 @@ signode += addnodes.desc_name(sig, sig) return sig -@@ -102,7 +122,7 @@ +@@ -93,7 +111,7 @@ As such, we link this to ``env-check-consistency``, even though it has nothing to do with the environment consistency check. """ @@ -123,7 +93,7 @@ return # allow translating deprecated index entries -@@ -119,10 +139,15 @@ +@@ -110,10 +128,15 @@ def setup(app): ++++++ pass-test_write_read_limited_history.patch ++++++ --- /var/tmp/diff_new_pack.MNBVyi/_old 2026-07-22 19:01:16.053158277 +0200 +++ /var/tmp/diff_new_pack.MNBVyi/_new 2026-07-22 19:01:16.057158413 +0200 @@ -2,10 +2,10 @@ Modules/readline.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) -Index: Python-3.13.13/Modules/readline.c +Index: Python-3.13.14/Modules/readline.c =================================================================== ---- Python-3.13.13.orig/Modules/readline.c 2026-04-07 20:19:01.000000000 +0200 -+++ Python-3.13.13/Modules/readline.c 2026-04-16 20:41:51.671384000 +0200 +--- Python-3.13.14.orig/Modules/readline.c 2026-06-10 14:24:04.000000000 +0200 ++++ Python-3.13.14/Modules/readline.c 2026-06-17 15:12:41.726025811 +0200 @@ -175,6 +175,8 @@ return PyUnicode_DecodeLocale(s, "surrogateescape"); } ++++++ test_UDPLITE_support.patch ++++++ --- /var/tmp/diff_new_pack.MNBVyi/_old 2026-07-22 19:01:16.133161013 +0200 +++ /var/tmp/diff_new_pack.MNBVyi/_new 2026-07-22 19:01:16.137161149 +0200 @@ -1,11 +1,11 @@ --- - Lib/test/test_socket.py | 21 +++++++++++++++++---- - 1 file changed, 17 insertions(+), 4 deletions(-) + Lib/test/test_socket.py | 18 +++++++++++++++++- + 1 file changed, 17 insertions(+), 1 deletion(-) -Index: Python-3.14.4/Lib/test/test_socket.py +Index: Python-3.13.14/Lib/test/test_socket.py =================================================================== ---- Python-3.14.4.orig/Lib/test/test_socket.py 2026-04-27 22:32:58.390808080 +0200 -+++ Python-3.14.4/Lib/test/test_socket.py 2026-04-27 22:51:31.284375485 +0200 +--- Python-3.13.14.orig/Lib/test/test_socket.py 2026-06-17 15:09:05.649370164 +0200 ++++ Python-3.13.14/Lib/test/test_socket.py 2026-06-17 15:26:46.425345602 +0200 @@ -168,6 +168,22 @@ return (cid is not None) @@ -29,14 +29,11 @@ def _have_socket_bluetooth(): """Check whether AF_BLUETOOTH sockets are supported on this host.""" try: -@@ -245,10 +261,7 @@ +@@ -264,7 +280,7 @@ HAVE_SOCKET_VSOCK = _have_socket_vsock() --# Older Android versions block UDPLITE with SELinux. --HAVE_SOCKET_UDPLITE = ( -- hasattr(socket, "IPPROTO_UDPLITE") -- and not (support.is_android and platform.android_ver().api_level < 29)) +-HAVE_SOCKET_UDPLITE = _have_udp_lite() +HAVE_SOCKET_UDPLITE = _have_socket_udplite() HAVE_SOCKET_BLUETOOTH = _have_socket_bluetooth()
