Compare commits
88 commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2260bebdb9 | ||
|
|
79d64abadf | ||
|
|
bd2563ea47 | ||
|
|
bef861129d | ||
|
|
f4716cbb08 | ||
|
|
c1b886b3b6 | ||
|
|
9d987df726 | ||
|
|
36fa2b0895 | ||
|
|
4669c6fce0 | ||
|
|
2b1a90b181 | ||
|
|
f26b7fcd3a | ||
|
|
576eed68c6 | ||
|
|
fc230a4cf1 | ||
|
|
b04f319cc6 | ||
|
|
9025dc9760 | ||
|
|
f45779a0aa | ||
|
|
94e3c06cd7 | ||
|
|
25248beb99 | ||
|
|
e9c5c0c3c4 | ||
|
|
fee84f7c55 | ||
|
|
cf66620612 | ||
|
|
ca8cc60bc4 | ||
|
|
aaf6ec2cca | ||
|
|
406c34b53b | ||
|
|
dd282ac7f3 | ||
|
|
6e767cf9f4 | ||
|
|
b4fbfd9335 | ||
|
|
8f8849fb7c | ||
|
|
5ce9d27cf1 | ||
|
|
8236063d9f | ||
|
|
78e3110af1 | ||
|
|
e0d3024961 | ||
|
|
1f64e4dcdb | ||
|
|
d849d8f127 | ||
|
|
e0af09b7c2 | ||
|
|
6d982d0a19 | ||
|
|
2986781bf7 | ||
|
|
56eb7aad4b | ||
|
|
e365cd89b9 | ||
|
|
d60c500d01 | ||
|
|
a7297274d1 | ||
|
|
041b6663c5 | ||
|
|
0bef7f1c35 | ||
|
|
c6a9f6fe3b | ||
|
|
937d86cf62 | ||
|
|
0ca0aa8525 | ||
|
|
cfc37cd117 | ||
|
|
56f34b9695 | ||
|
|
e8a3251a5e | ||
|
|
8c03c574c2 | ||
|
|
482bb556a9 | ||
|
|
278f3033f3 | ||
|
|
797b97aa4d | ||
|
|
c0c82aa771 | ||
|
|
a419176c4c | ||
|
|
ed3fc5a80b | ||
|
|
48ee6e9c72 | ||
|
|
1521b586f0 | ||
|
|
4041c8a86e | ||
|
|
eb9909215c | ||
|
|
64000497af | ||
|
|
eda37b70f4 | ||
|
|
e3c3cbe96e | ||
|
|
b06a2a26f3 | ||
|
|
09b6af7951 | ||
|
|
014f2b2430 | ||
|
|
ef2d703504 | ||
|
|
143d59d932 | ||
|
|
1e24d38cd9 | ||
|
|
05411b4c04 | ||
|
|
e3f12dbc36 | ||
|
|
eee246a4f2 | ||
|
|
096e4f0d88 | ||
|
|
81efe7427b | ||
|
|
608ee6ea09 | ||
|
|
4490e888a6 | ||
|
|
a6be165890 | ||
|
|
71818464a3 | ||
|
|
a9eff720fa | ||
|
|
524afa95d3 | ||
|
|
594724cb65 | ||
|
|
83a2832b2b | ||
|
|
8d4a33cab3 | ||
|
|
2f4307845b | ||
|
|
85202ae1ee | ||
|
|
31971f96ff | ||
|
|
1e0faaa82b | ||
|
|
42592ff6ca |
16 changed files with 1256 additions and 405 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
|
@ -1,3 +1,4 @@
|
||||||
/*.tar.*
|
/*.tar.*
|
||||||
|
/*-jit_stencils.h
|
||||||
/*.src.rpm
|
/*.src.rpm
|
||||||
/results_python3*
|
/results_python3*
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||||
From: =?UTF-8?q?Miro=20Hron=C4=8Dok?= <miro@hroncok.cz>
|
From: =?UTF-8?q?Miro=20Hron=C4=8Dok?= <miro@hroncok.cz>
|
||||||
Date: Mon, 15 Feb 2021 12:19:27 +0100
|
Date: Mon, 15 Feb 2021 12:19:27 +0100
|
||||||
Subject: [PATCH] 00251: Change user install location
|
Subject: 00251: Change user install location
|
||||||
MIME-Version: 1.0
|
MIME-Version: 1.0
|
||||||
Content-Type: text/plain; charset=UTF-8
|
Content-Type: text/plain; charset=UTF-8
|
||||||
Content-Transfer-Encoding: 8bit
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
@ -30,10 +30,10 @@ Co-authored-by: Lumír Balhar <frenzy.madness@gmail.com>
|
||||||
3 files changed, 72 insertions(+), 4 deletions(-)
|
3 files changed, 72 insertions(+), 4 deletions(-)
|
||||||
|
|
||||||
diff --git a/Lib/site.py b/Lib/site.py
|
diff --git a/Lib/site.py b/Lib/site.py
|
||||||
index 54f07ab5b4..69ceaa443e 100644
|
index aeb7c6cfc7..86f9ae9e76 100644
|
||||||
--- a/Lib/site.py
|
--- a/Lib/site.py
|
||||||
+++ b/Lib/site.py
|
+++ b/Lib/site.py
|
||||||
@@ -414,8 +414,15 @@ def getsitepackages(prefixes=None):
|
@@ -421,8 +421,15 @@ def getsitepackages(prefixes=None):
|
||||||
return sitepackages
|
return sitepackages
|
||||||
|
|
||||||
def addsitepackages(known_paths, prefixes=None):
|
def addsitepackages(known_paths, prefixes=None):
|
||||||
|
|
@ -51,7 +51,7 @@ index 54f07ab5b4..69ceaa443e 100644
|
||||||
if os.path.isdir(sitedir):
|
if os.path.isdir(sitedir):
|
||||||
addsitedir(sitedir, known_paths)
|
addsitedir(sitedir, known_paths)
|
||||||
diff --git a/Lib/sysconfig/__init__.py b/Lib/sysconfig/__init__.py
|
diff --git a/Lib/sysconfig/__init__.py b/Lib/sysconfig/__init__.py
|
||||||
index 67a071963d..371e6844b8 100644
|
index faf8273bd0..d7667bbc77 100644
|
||||||
--- a/Lib/sysconfig/__init__.py
|
--- a/Lib/sysconfig/__init__.py
|
||||||
+++ b/Lib/sysconfig/__init__.py
|
+++ b/Lib/sysconfig/__init__.py
|
||||||
@@ -106,6 +106,12 @@
|
@@ -106,6 +106,12 @@
|
||||||
|
|
@ -67,7 +67,7 @@ index 67a071963d..371e6844b8 100644
|
||||||
def _get_implementation():
|
def _get_implementation():
|
||||||
return 'Python'
|
return 'Python'
|
||||||
|
|
||||||
@@ -167,6 +173,19 @@ def joinuser(*args):
|
@@ -169,6 +175,19 @@ def joinuser(*args):
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -87,7 +87,7 @@ index 67a071963d..371e6844b8 100644
|
||||||
_SCHEME_KEYS = ('stdlib', 'platstdlib', 'purelib', 'platlib', 'include',
|
_SCHEME_KEYS = ('stdlib', 'platstdlib', 'purelib', 'platlib', 'include',
|
||||||
'scripts', 'data')
|
'scripts', 'data')
|
||||||
|
|
||||||
@@ -259,11 +278,40 @@ def _extend_dict(target_dict, other_dict):
|
@@ -268,11 +287,40 @@ def _extend_dict(target_dict, other_dict):
|
||||||
target_dict[key] = value
|
target_dict[key] = value
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -120,7 +120,7 @@ index 67a071963d..371e6844b8 100644
|
||||||
+ # we only change the defaults here, so explicit --prefix will take precedence
|
+ # we only change the defaults here, so explicit --prefix will take precedence
|
||||||
+ # https://fedoraproject.org/wiki/Changes/Making_sudo_pip_safe
|
+ # https://fedoraproject.org/wiki/Changes/Making_sudo_pip_safe
|
||||||
+ if (scheme == 'posix_prefix' and
|
+ if (scheme == 'posix_prefix' and
|
||||||
+ get_config_vars('prefix')[0] == '/usr' and
|
+ sys.prefix == '/usr' and
|
||||||
+ 'RPM_BUILD_ROOT' not in os.environ):
|
+ 'RPM_BUILD_ROOT' not in os.environ):
|
||||||
+ _extend_dict(vars, _config_vars_local())
|
+ _extend_dict(vars, _config_vars_local())
|
||||||
+ else:
|
+ else:
|
||||||
|
|
@ -130,10 +130,10 @@ index 67a071963d..371e6844b8 100644
|
||||||
# On Windows we want to substitute 'lib' for schemes rather
|
# On Windows we want to substitute 'lib' for schemes rather
|
||||||
# than the native value (without modifying vars, in case it
|
# than the native value (without modifying vars, in case it
|
||||||
diff --git a/Lib/test/test_sysconfig.py b/Lib/test/test_sysconfig.py
|
diff --git a/Lib/test/test_sysconfig.py b/Lib/test/test_sysconfig.py
|
||||||
index 9bbf8d0c6c..609bf5c373 100644
|
index 1fe4b6849f..e0cb3ec23a 100644
|
||||||
--- a/Lib/test/test_sysconfig.py
|
--- a/Lib/test/test_sysconfig.py
|
||||||
+++ b/Lib/test/test_sysconfig.py
|
+++ b/Lib/test/test_sysconfig.py
|
||||||
@@ -130,8 +130,19 @@ def test_get_path(self):
|
@@ -132,8 +132,19 @@ def test_get_path(self):
|
||||||
for scheme in _INSTALL_SCHEMES:
|
for scheme in _INSTALL_SCHEMES:
|
||||||
for name in _INSTALL_SCHEMES[scheme]:
|
for name in _INSTALL_SCHEMES[scheme]:
|
||||||
expected = _INSTALL_SCHEMES[scheme][name].format(**config_vars)
|
expected = _INSTALL_SCHEMES[scheme][name].format(**config_vars)
|
||||||
|
|
@ -154,7 +154,7 @@ index 9bbf8d0c6c..609bf5c373 100644
|
||||||
os.path.normpath(expected),
|
os.path.normpath(expected),
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -386,7 +397,7 @@ def test_get_config_h_filename(self):
|
@@ -397,7 +408,7 @@ def test_get_config_h_filename(self):
|
||||||
self.assertTrue(os.path.isfile(config_h), config_h)
|
self.assertTrue(os.path.isfile(config_h), config_h)
|
||||||
|
|
||||||
def test_get_scheme_names(self):
|
def test_get_scheme_names(self):
|
||||||
|
|
@ -163,7 +163,7 @@ index 9bbf8d0c6c..609bf5c373 100644
|
||||||
if HAS_USER_BASE:
|
if HAS_USER_BASE:
|
||||||
wanted.extend(['nt_user', 'osx_framework_user', 'posix_user'])
|
wanted.extend(['nt_user', 'osx_framework_user', 'posix_user'])
|
||||||
self.assertEqual(get_scheme_names(), tuple(sorted(wanted)))
|
self.assertEqual(get_scheme_names(), tuple(sorted(wanted)))
|
||||||
@@ -398,6 +409,8 @@ def test_symlink(self): # Issue 7880
|
@@ -409,6 +420,8 @@ def test_symlink(self): # Issue 7880
|
||||||
cmd = "-c", "import sysconfig; print(sysconfig.get_platform())"
|
cmd = "-c", "import sysconfig; print(sysconfig.get_platform())"
|
||||||
self.assertEqual(py.call_real(*cmd), py.call_link(*cmd))
|
self.assertEqual(py.call_real(*cmd), py.call_link(*cmd))
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,133 @@
|
||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||||
|
From: =?UTF-8?q?Miro=20Hron=C4=8Dok?= <miro@hroncok.cz>
|
||||||
|
Date: Wed, 12 Aug 2026 15:18:39 +0200
|
||||||
|
Subject: 00466: Downstream only: Lower XML_COMBINED_VERSION threshold for
|
||||||
|
reparse deferral
|
||||||
|
|
||||||
|
RHEL 9 expat 2.5.0 has XML_SetReparseDeferralEnabled backported
|
||||||
|
via the CVE-2023-52425 fix, but XML_COMBINED_VERSION remains 20500.
|
||||||
|
CPython's #if XML_COMBINED_VERSION >= 20600 guards compile the setter
|
||||||
|
as a no-op, so SetReparseDeferralEnabled silently does nothing and
|
||||||
|
GetReparseDeferralEnabled always returns False, even though the expat
|
||||||
|
library actually supports (and enables) reparse deferral.
|
||||||
|
|
||||||
|
Lower the threshold from 20600 to 20500 so that CPython uses the
|
||||||
|
backported function. This makes the Python API actually work on RHEL 9
|
||||||
|
and fixes test failures (test_reparse_deferral_disabled,
|
||||||
|
test_flush_reparse_deferral_disabled, test_simple_xml_chunk_*).
|
||||||
|
|
||||||
|
The spec file BuildRequires expat-devel >= 2.5.0-2 to ensure the
|
||||||
|
backported function is available.
|
||||||
|
---
|
||||||
|
Lib/test/test_pyexpat.py | 6 +++---
|
||||||
|
Lib/test/test_sax.py | 4 ++--
|
||||||
|
Lib/test/test_xml_etree.py | 4 ++--
|
||||||
|
Modules/pyexpat.c | 6 +++---
|
||||||
|
4 files changed, 10 insertions(+), 10 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/Lib/test/test_pyexpat.py b/Lib/test/test_pyexpat.py
|
||||||
|
index fd3077063b..34f86e2dbd 100644
|
||||||
|
--- a/Lib/test/test_pyexpat.py
|
||||||
|
+++ b/Lib/test/test_pyexpat.py
|
||||||
|
@@ -1005,7 +1005,7 @@ def test_error_path_no_crash(self):
|
||||||
|
class ReparseDeferralTest(unittest.TestCase):
|
||||||
|
def test_getter_setter_round_trip(self):
|
||||||
|
parser = expat.ParserCreate()
|
||||||
|
- enabled = (expat.version_info >= (2, 6, 0))
|
||||||
|
+ enabled = (expat.version_info >= (2, 5, 0))
|
||||||
|
|
||||||
|
self.assertIs(parser.GetReparseDeferralEnabled(), enabled)
|
||||||
|
parser.SetReparseDeferralEnabled(False)
|
||||||
|
@@ -1014,7 +1014,7 @@ def test_getter_setter_round_trip(self):
|
||||||
|
self.assertIs(parser.GetReparseDeferralEnabled(), enabled)
|
||||||
|
|
||||||
|
def test_reparse_deferral_enabled(self):
|
||||||
|
- if expat.version_info < (2, 6, 0):
|
||||||
|
+ if expat.version_info < (2, 5, 0):
|
||||||
|
self.skipTest(f'Expat {expat.version_info} does not '
|
||||||
|
'support reparse deferral')
|
||||||
|
|
||||||
|
@@ -1045,7 +1045,7 @@ def start_element(name, _):
|
||||||
|
|
||||||
|
parser = expat.ParserCreate()
|
||||||
|
parser.StartElementHandler = start_element
|
||||||
|
- if expat.version_info >= (2, 6, 0):
|
||||||
|
+ if expat.version_info >= (2, 5, 0):
|
||||||
|
parser.SetReparseDeferralEnabled(False)
|
||||||
|
self.assertFalse(parser.GetReparseDeferralEnabled())
|
||||||
|
|
||||||
|
diff --git a/Lib/test/test_sax.py b/Lib/test/test_sax.py
|
||||||
|
index 5c10bcedc6..114f002b0b 100644
|
||||||
|
--- a/Lib/test/test_sax.py
|
||||||
|
+++ b/Lib/test/test_sax.py
|
||||||
|
@@ -1216,7 +1216,7 @@ def test_expat_incremental_reset(self):
|
||||||
|
|
||||||
|
self.assertEqual(result.getvalue(), start + b"<doc>text</doc>")
|
||||||
|
|
||||||
|
- @unittest.skipIf(pyexpat.version_info < (2, 6, 0),
|
||||||
|
+ @unittest.skipIf(pyexpat.version_info < (2, 5, 0),
|
||||||
|
f'Expat {pyexpat.version_info} does not '
|
||||||
|
'support reparse deferral')
|
||||||
|
def test_flush_reparse_deferral_enabled(self):
|
||||||
|
@@ -1250,7 +1250,7 @@ def test_flush_reparse_deferral_disabled(self):
|
||||||
|
for chunk in ("<doc", ">"):
|
||||||
|
parser.feed(chunk)
|
||||||
|
|
||||||
|
- if pyexpat.version_info >= (2, 6, 0):
|
||||||
|
+ if pyexpat.version_info >= (2, 5, 0):
|
||||||
|
parser._parser.SetReparseDeferralEnabled(False)
|
||||||
|
self.assertEqual(result.getvalue(), start) # i.e. no elements started
|
||||||
|
|
||||||
|
diff --git a/Lib/test/test_xml_etree.py b/Lib/test/test_xml_etree.py
|
||||||
|
index 6da7c34dc4..d846ddf4e2 100644
|
||||||
|
--- a/Lib/test/test_xml_etree.py
|
||||||
|
+++ b/Lib/test/test_xml_etree.py
|
||||||
|
@@ -1803,7 +1803,7 @@ def test_unknown_event(self):
|
||||||
|
with self.assertRaisesRegex(ValueError, "unknown event 'bogus'"):
|
||||||
|
ET.XMLPullParser(events=(x.decode() for x in (b'start', b'end', b'bogus')))
|
||||||
|
|
||||||
|
- @unittest.skipIf(pyexpat.version_info < (2, 6, 0),
|
||||||
|
+ @unittest.skipIf(pyexpat.version_info < (2, 5, 0),
|
||||||
|
f'Expat {pyexpat.version_info} does not '
|
||||||
|
'support reparse deferral')
|
||||||
|
def test_flush_reparse_deferral_enabled(self):
|
||||||
|
@@ -1833,7 +1833,7 @@ def test_flush_reparse_deferral_disabled(self):
|
||||||
|
for chunk in ("<doc", ">"):
|
||||||
|
parser.feed(chunk)
|
||||||
|
|
||||||
|
- if pyexpat.version_info >= (2, 6, 0):
|
||||||
|
+ if pyexpat.version_info >= (2, 5, 0):
|
||||||
|
if not ET is pyET:
|
||||||
|
self.skipTest(f'XMLParser.(Get|Set)ReparseDeferralEnabled '
|
||||||
|
'methods not available in C')
|
||||||
|
diff --git a/Modules/pyexpat.c b/Modules/pyexpat.c
|
||||||
|
index f9fd7a7a5b..e88b7f16a8 100644
|
||||||
|
--- a/Modules/pyexpat.c
|
||||||
|
+++ b/Modules/pyexpat.c
|
||||||
|
@@ -814,7 +814,7 @@ pyexpat_xmlparser_SetReparseDeferralEnabled_impl(xmlparseobject *self,
|
||||||
|
int enabled)
|
||||||
|
/*[clinic end generated code: output=5ec539e3b63c8c49 input=021eb9e0bafc32c5]*/
|
||||||
|
{
|
||||||
|
-#if XML_COMBINED_VERSION >= 20600
|
||||||
|
+#if XML_COMBINED_VERSION >= 20500
|
||||||
|
XML_SetReparseDeferralEnabled(self->itself, enabled ? XML_TRUE : XML_FALSE);
|
||||||
|
self->reparse_deferral_enabled = (bool)enabled;
|
||||||
|
#endif
|
||||||
|
@@ -1478,7 +1478,7 @@ newxmlparseobject(pyexpat_state *state, const char *encoding,
|
||||||
|
self->ns_prefixes = 0;
|
||||||
|
self->handlers = NULL;
|
||||||
|
self->intern = Py_XNewRef(intern);
|
||||||
|
-#if XML_COMBINED_VERSION >= 20600
|
||||||
|
+#if XML_COMBINED_VERSION >= 20500
|
||||||
|
self->reparse_deferral_enabled = true;
|
||||||
|
#else
|
||||||
|
self->reparse_deferral_enabled = false;
|
||||||
|
@@ -2396,7 +2396,7 @@ pyexpat_exec(PyObject *mod)
|
||||||
|
#else
|
||||||
|
capi->SetHashSalt16Bytes = NULL;
|
||||||
|
#endif
|
||||||
|
-#if XML_COMBINED_VERSION >= 20600
|
||||||
|
+#if XML_COMBINED_VERSION >= 20500
|
||||||
|
capi->SetReparseDeferralEnabled = XML_SetReparseDeferralEnabled;
|
||||||
|
#else
|
||||||
|
capi->SetReparseDeferralEnabled = NULL;
|
||||||
59
00475-cve-2025-15367.patch
Normal file
59
00475-cve-2025-15367.patch
Normal file
|
|
@ -0,0 +1,59 @@
|
||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Seth Michael Larson <seth@python.org>
|
||||||
|
Date: Tue, 20 Jan 2026 14:46:32 -0600
|
||||||
|
Subject: 00475: CVE-2025-15367
|
||||||
|
|
||||||
|
Downstream only: Reject control characters in POP3 commands
|
||||||
|
---
|
||||||
|
Lib/poplib.py | 2 ++
|
||||||
|
Lib/test/test_poplib.py | 8 ++++++++
|
||||||
|
.../2026-01-16-11-43-47.gh-issue-143923.DuytMe.rst | 1 +
|
||||||
|
3 files changed, 11 insertions(+)
|
||||||
|
create mode 100644 Misc/NEWS.d/next/Security/2026-01-16-11-43-47.gh-issue-143923.DuytMe.rst
|
||||||
|
|
||||||
|
diff --git a/Lib/poplib.py b/Lib/poplib.py
|
||||||
|
index 4469bff44b..b97274c5c3 100644
|
||||||
|
--- a/Lib/poplib.py
|
||||||
|
+++ b/Lib/poplib.py
|
||||||
|
@@ -122,6 +122,8 @@ def _putline(self, line):
|
||||||
|
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)
|
||||||
|
|
||||||
|
|
||||||
|
diff --git a/Lib/test/test_poplib.py b/Lib/test/test_poplib.py
|
||||||
|
index ef2da97f86..18ca7cb556 100644
|
||||||
|
--- a/Lib/test/test_poplib.py
|
||||||
|
+++ b/Lib/test/test_poplib.py
|
||||||
|
@@ -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
|
||||||
|
|
||||||
|
|
||||||
|
test_support.requires_working_socket(module=True)
|
||||||
|
@@ -395,6 +396,13 @@ def test_quit(self):
|
||||||
|
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()
|
||||||
|
diff --git a/Misc/NEWS.d/next/Security/2026-01-16-11-43-47.gh-issue-143923.DuytMe.rst b/Misc/NEWS.d/next/Security/2026-01-16-11-43-47.gh-issue-143923.DuytMe.rst
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000000..3cde4df3e0
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/Misc/NEWS.d/next/Security/2026-01-16-11-43-47.gh-issue-143923.DuytMe.rst
|
||||||
|
@@ -0,0 +1 @@
|
||||||
|
+Reject control characters in POP3 commands.
|
||||||
|
|
@ -0,0 +1,156 @@
|
||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Petr Viktorin <encukou@gmail.com>
|
||||||
|
Date: Fri, 6 Feb 2026 10:51:02 +0100
|
||||||
|
Subject: 00477: Raise an error when importing stdlib modules compiled for a
|
||||||
|
different Python version
|
||||||
|
|
||||||
|
This is a downstream workaround "implementing"
|
||||||
|
https://github.com/python/cpython/pull/137212 -
|
||||||
|
the mechanism for the check exists in Python 3.15+, where it needs to be
|
||||||
|
added to the standard library modules.
|
||||||
|
In Fedora, we need it also in previous Python versions, as we experience
|
||||||
|
segmentation fault when importing stdlib modules after update while
|
||||||
|
Python is running.
|
||||||
|
|
||||||
|
_tkinter, _tracemalloc and readline are not calling PyModuleDef_Init,
|
||||||
|
which is modified with this patch, hence they need a
|
||||||
|
direct call to the check function.
|
||||||
|
|
||||||
|
Co-Authored-By: Karolina Surma <ksurma@redhat.com>
|
||||||
|
---
|
||||||
|
Include/moduleobject.h | 43 ++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
Makefile.pre.in | 3 +++
|
||||||
|
Modules/_tkinter.c | 6 ++++++
|
||||||
|
Modules/_tracemalloc.c | 6 ++++++
|
||||||
|
Modules/readline.c | 6 ++++++
|
||||||
|
Objects/moduleobject.c | 1 +
|
||||||
|
6 files changed, 65 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/Include/moduleobject.h b/Include/moduleobject.h
|
||||||
|
index 2a17c891dd..64017c666c 100644
|
||||||
|
--- a/Include/moduleobject.h
|
||||||
|
+++ b/Include/moduleobject.h
|
||||||
|
@@ -116,6 +116,49 @@ struct PyModuleDef {
|
||||||
|
freefunc m_free;
|
||||||
|
};
|
||||||
|
|
||||||
|
+#if defined(_PyHack_check_version_on_modinit) && defined(Py_BUILD_CORE)
|
||||||
|
+/* The mechanism for the check has been implemented on Python 3.15+:
|
||||||
|
+ * https://github.com/python/cpython/pull/137212.
|
||||||
|
+ * In Fedora, we need this in older Pythons too:
|
||||||
|
+ * if somebody attempts to import a module compiled for a different Python version,
|
||||||
|
+ * instead of segmentation fault a meaningful error is raised.
|
||||||
|
+ */
|
||||||
|
+PyAPI_DATA(const unsigned long) Py_Version;
|
||||||
|
+
|
||||||
|
+static inline int
|
||||||
|
+_PyHack_CheckInternalAPIVersion(const char *mod_name)
|
||||||
|
+{
|
||||||
|
+ if (PY_VERSION_HEX != Py_Version) {
|
||||||
|
+ PyErr_Format(
|
||||||
|
+ PyExc_ImportError,
|
||||||
|
+ "internal Python C API version mismatch: "
|
||||||
|
+ "module %s compiled with %lu.%lu.%lu; "
|
||||||
|
+ "runtime version is %lu.%lu.%lu",
|
||||||
|
+ mod_name,
|
||||||
|
+ (const unsigned long)((PY_VERSION_HEX >> 24) & 0xFF),
|
||||||
|
+ (const unsigned long)((PY_VERSION_HEX >> 16) & 0xFF),
|
||||||
|
+ (const unsigned long)((PY_VERSION_HEX >> 8) & 0xFF),
|
||||||
|
+ (const unsigned long)((Py_Version >> 24) & 0xFF),
|
||||||
|
+ (const unsigned long)((Py_Version >> 16) & 0xFF),
|
||||||
|
+ (const unsigned long)((Py_Version >> 8) & 0xFF)
|
||||||
|
+ );
|
||||||
|
+ return -1;
|
||||||
|
+ }
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static inline PyObject *
|
||||||
|
+PyModuleDef_Init_with_check(PyModuleDef *def)
|
||||||
|
+{
|
||||||
|
+ if (_PyHack_CheckInternalAPIVersion(def->m_name) < 0) {
|
||||||
|
+ return NULL;
|
||||||
|
+ }
|
||||||
|
+ return PyModuleDef_Init(def);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+#define PyModuleDef_Init PyModuleDef_Init_with_check
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
diff --git a/Makefile.pre.in b/Makefile.pre.in
|
||||||
|
index 526d500fe0..506ec30408 100644
|
||||||
|
--- a/Makefile.pre.in
|
||||||
|
+++ b/Makefile.pre.in
|
||||||
|
@@ -3426,3 +3426,6 @@ MODULE__MULTIBYTECODEC_DEPS=$(srcdir)/Modules/cjkcodecs/multibytecodec.h
|
||||||
|
# Local Variables:
|
||||||
|
# mode: makefile
|
||||||
|
# End:
|
||||||
|
+
|
||||||
|
+# Fedora-specific, downstream only
|
||||||
|
+PY_STDMODULE_CFLAGS += -D_PyHack_check_version_on_modinit=1
|
||||||
|
diff --git a/Modules/_tkinter.c b/Modules/_tkinter.c
|
||||||
|
index 22126b67d8..7ef5b5d5cd 100644
|
||||||
|
--- a/Modules/_tkinter.c
|
||||||
|
+++ b/Modules/_tkinter.c
|
||||||
|
@@ -3611,6 +3611,12 @@ static struct PyModuleDef _tkintermodule = {
|
||||||
|
PyMODINIT_FUNC
|
||||||
|
PyInit__tkinter(void)
|
||||||
|
{
|
||||||
|
+ #ifdef _PyHack_check_version_on_modinit
|
||||||
|
+ if (_PyHack_CheckInternalAPIVersion("_tkinter") < 0) {
|
||||||
|
+ return NULL;
|
||||||
|
+ }
|
||||||
|
+ #endif
|
||||||
|
+
|
||||||
|
PyObject *m, *uexe, *cexe;
|
||||||
|
|
||||||
|
tcl_lock = PyThread_allocate_lock();
|
||||||
|
diff --git a/Modules/_tracemalloc.c b/Modules/_tracemalloc.c
|
||||||
|
index be71fc9fc9..67922098b2 100644
|
||||||
|
--- a/Modules/_tracemalloc.c
|
||||||
|
+++ b/Modules/_tracemalloc.c
|
||||||
|
@@ -215,6 +215,12 @@ static struct PyModuleDef module_def = {
|
||||||
|
PyMODINIT_FUNC
|
||||||
|
PyInit__tracemalloc(void)
|
||||||
|
{
|
||||||
|
+ #ifdef _PyHack_check_version_on_modinit
|
||||||
|
+ if (_PyHack_CheckInternalAPIVersion("_tracemalloc") < 0) {
|
||||||
|
+ return NULL;
|
||||||
|
+ }
|
||||||
|
+ #endif
|
||||||
|
+
|
||||||
|
PyObject *mod = PyModule_Create(&module_def);
|
||||||
|
if (mod == NULL) {
|
||||||
|
return NULL;
|
||||||
|
diff --git a/Modules/readline.c b/Modules/readline.c
|
||||||
|
index 7708f47d4d..7c0b70caa4 100644
|
||||||
|
--- a/Modules/readline.c
|
||||||
|
+++ b/Modules/readline.c
|
||||||
|
@@ -1612,6 +1612,12 @@ static struct PyModuleDef readlinemodule = {
|
||||||
|
PyMODINIT_FUNC
|
||||||
|
PyInit_readline(void)
|
||||||
|
{
|
||||||
|
+ #ifdef _PyHack_check_version_on_modinit
|
||||||
|
+ if (_PyHack_CheckInternalAPIVersion("readline") < 0) {
|
||||||
|
+ return NULL;
|
||||||
|
+ }
|
||||||
|
+ #endif
|
||||||
|
+
|
||||||
|
const char *backend = "readline";
|
||||||
|
PyObject *m;
|
||||||
|
readlinestate *mod_state;
|
||||||
|
diff --git a/Objects/moduleobject.c b/Objects/moduleobject.c
|
||||||
|
index b68584b5dd..cbf95dc92a 100644
|
||||||
|
--- a/Objects/moduleobject.c
|
||||||
|
+++ b/Objects/moduleobject.c
|
||||||
|
@@ -50,6 +50,7 @@ _PyModule_IsExtension(PyObject *obj)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
+#undef PyModuleDef_Init
|
||||||
|
PyObject*
|
||||||
|
PyModuleDef_Init(PyModuleDef* def)
|
||||||
|
{
|
||||||
|
|
@ -0,0 +1,146 @@
|
||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||||
|
From: =?UTF-8?q?Miro=20Hron=C4=8Dok?= <miro@hroncok.cz>
|
||||||
|
Date: Thu, 16 Apr 2026 14:39:41 +0200
|
||||||
|
Subject: 00486: gh-148646: Add --enable-prebuilt-jit-stencils configure flag
|
||||||
|
|
||||||
|
---
|
||||||
|
...-04-16-14-39-33.gh-issue-148646.iIIgWF.rst | 6 +++++
|
||||||
|
Tools/jit/_targets.py | 3 ++-
|
||||||
|
Tools/jit/build.py | 6 +++++
|
||||||
|
configure | 26 +++++++++++++++++++
|
||||||
|
configure.ac | 13 ++++++++++
|
||||||
|
5 files changed, 53 insertions(+), 1 deletion(-)
|
||||||
|
create mode 100644 Misc/NEWS.d/next/Build/2026-04-16-14-39-33.gh-issue-148646.iIIgWF.rst
|
||||||
|
|
||||||
|
diff --git a/Misc/NEWS.d/next/Build/2026-04-16-14-39-33.gh-issue-148646.iIIgWF.rst b/Misc/NEWS.d/next/Build/2026-04-16-14-39-33.gh-issue-148646.iIIgWF.rst
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000000..52dbc347a0
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/Misc/NEWS.d/next/Build/2026-04-16-14-39-33.gh-issue-148646.iIIgWF.rst
|
||||||
|
@@ -0,0 +1,6 @@
|
||||||
|
+Add a new ``--enable-prebuilt-jit-stencils`` configure flag that forces the
|
||||||
|
+build to use the existing provided JIT stencils even when the digest at the
|
||||||
|
+beginning of the file does not match expectations. That allows
|
||||||
|
+redistributors who prebuilt the JIT stencils on a system with a different
|
||||||
|
+autoconf version to still use them even when ``pyconfig.h`` is slightly
|
||||||
|
+different.
|
||||||
|
diff --git a/Tools/jit/_targets.py b/Tools/jit/_targets.py
|
||||||
|
index f1085cc9bf..3d8af735e2 100644
|
||||||
|
--- a/Tools/jit/_targets.py
|
||||||
|
+++ b/Tools/jit/_targets.py
|
||||||
|
@@ -205,6 +205,7 @@ def build(
|
||||||
|
*,
|
||||||
|
comment: str = "",
|
||||||
|
force: bool = False,
|
||||||
|
+ prebuilt: bool = False,
|
||||||
|
jit_stencils: pathlib.Path,
|
||||||
|
) -> None:
|
||||||
|
"""Build jit_stencils.h in the given directory."""
|
||||||
|
@@ -218,7 +219,7 @@ def build(
|
||||||
|
if (
|
||||||
|
not force
|
||||||
|
and jit_stencils.exists()
|
||||||
|
- and jit_stencils.read_text().startswith(digest)
|
||||||
|
+ and (prebuilt or jit_stencils.read_text().startswith(digest))
|
||||||
|
):
|
||||||
|
return
|
||||||
|
stencil_groups = ASYNCIO_RUNNER.run(self._build_stencils())
|
||||||
|
diff --git a/Tools/jit/build.py b/Tools/jit/build.py
|
||||||
|
index a073300592..5580985974 100644
|
||||||
|
--- a/Tools/jit/build.py
|
||||||
|
+++ b/Tools/jit/build.py
|
||||||
|
@@ -42,6 +42,11 @@
|
||||||
|
parser.add_argument(
|
||||||
|
"--cflags", help="additional flags to pass to the compiler", default=""
|
||||||
|
)
|
||||||
|
+ parser.add_argument(
|
||||||
|
+ "--prebuilt",
|
||||||
|
+ action="store_true",
|
||||||
|
+ help="accept prebuilt stencils even if the digest does not match",
|
||||||
|
+ )
|
||||||
|
args = parser.parse_args()
|
||||||
|
for target in args.target:
|
||||||
|
target.debug = args.debug
|
||||||
|
@@ -52,6 +57,7 @@
|
||||||
|
target.build(
|
||||||
|
comment=comment,
|
||||||
|
force=args.force,
|
||||||
|
+ prebuilt=args.prebuilt,
|
||||||
|
jit_stencils=args.output_dir / f"jit_stencils-{target.triple}.h",
|
||||||
|
)
|
||||||
|
jit_stencils_h = args.output_dir / "jit_stencils.h"
|
||||||
|
diff --git a/configure b/configure
|
||||||
|
index 2cb22a7806..1b396c92b2 100755
|
||||||
|
--- a/configure
|
||||||
|
+++ b/configure
|
||||||
|
@@ -1105,6 +1105,7 @@ with_strict_overflow
|
||||||
|
enable_safety
|
||||||
|
enable_slower_safety
|
||||||
|
enable_experimental_jit
|
||||||
|
+enable_prebuilt_jit_stencils
|
||||||
|
with_dsymutil
|
||||||
|
with_address_sanitizer
|
||||||
|
with_memory_sanitizer
|
||||||
|
@@ -1842,6 +1843,9 @@ Optional Features:
|
||||||
|
--enable-experimental-jit[=no|yes|yes-off|interpreter]
|
||||||
|
build the experimental just-in-time compiler
|
||||||
|
(default is no)
|
||||||
|
+ --enable-prebuilt-jit-stencils
|
||||||
|
+ accept prebuilt JIT stencils even if the digest does
|
||||||
|
+ not match (default is no)
|
||||||
|
--enable-loadable-sqlite-extensions
|
||||||
|
support loadable extensions in the sqlite3 module,
|
||||||
|
see Doc/library/sqlite3.rst (default is no)
|
||||||
|
@@ -11045,6 +11049,28 @@ fi
|
||||||
|
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $tier2_flags $jit_flags" >&5
|
||||||
|
printf "%s\n" "$tier2_flags $jit_flags" >&6; }
|
||||||
|
|
||||||
|
+# Check for --enable-prebuilt-jit-stencils:
|
||||||
|
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for --enable-prebuilt-jit-stencils" >&5
|
||||||
|
+printf %s "checking for --enable-prebuilt-jit-stencils... " >&6; }
|
||||||
|
+# Check whether --enable-prebuilt-jit-stencils was given.
|
||||||
|
+if test ${enable_prebuilt_jit_stencils+y}
|
||||||
|
+then :
|
||||||
|
+ enableval=$enable_prebuilt_jit_stencils;
|
||||||
|
+else case e in #(
|
||||||
|
+ e) enable_prebuilt_jit_stencils=no ;;
|
||||||
|
+esac
|
||||||
|
+fi
|
||||||
|
+
|
||||||
|
+if test "x$enable_prebuilt_jit_stencils" = xno
|
||||||
|
+then :
|
||||||
|
+
|
||||||
|
+else case e in #(
|
||||||
|
+ e) as_fn_append REGEN_JIT_COMMAND " --prebuilt" ;;
|
||||||
|
+esac
|
||||||
|
+fi
|
||||||
|
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_prebuilt_jit_stencils" >&5
|
||||||
|
+printf "%s\n" "$enable_prebuilt_jit_stencils" >&6; }
|
||||||
|
+
|
||||||
|
if test "$disable_gil" = "yes" -a "$enable_experimental_jit" != "no"; then
|
||||||
|
# GH-133171: This configuration builds the JIT but never actually uses it,
|
||||||
|
# which is surprising (and strictly worse than not building it at all):
|
||||||
|
diff --git a/configure.ac b/configure.ac
|
||||||
|
index 967d34d47a..51160cafc2 100644
|
||||||
|
--- a/configure.ac
|
||||||
|
+++ b/configure.ac
|
||||||
|
@@ -2873,6 +2873,19 @@ AC_SUBST([REGEN_JIT_COMMAND])
|
||||||
|
AC_SUBST([JIT_STENCILS_H])
|
||||||
|
AC_MSG_RESULT([$tier2_flags $jit_flags])
|
||||||
|
|
||||||
|
+# Check for --enable-prebuilt-jit-stencils:
|
||||||
|
+AC_MSG_CHECKING([for --enable-prebuilt-jit-stencils])
|
||||||
|
+AC_ARG_ENABLE([prebuilt-jit-stencils],
|
||||||
|
+ [AS_HELP_STRING([--enable-prebuilt-jit-stencils],
|
||||||
|
+ [accept prebuilt JIT stencils even if the digest does not match (default is no)])],
|
||||||
|
+ [],
|
||||||
|
+ [enable_prebuilt_jit_stencils=no])
|
||||||
|
+AS_VAR_IF([enable_prebuilt_jit_stencils],
|
||||||
|
+ [no],
|
||||||
|
+ [],
|
||||||
|
+ [AS_VAR_APPEND([REGEN_JIT_COMMAND], [" --prebuilt"])])
|
||||||
|
+AC_MSG_RESULT([$enable_prebuilt_jit_stencils])
|
||||||
|
+
|
||||||
|
if test "$disable_gil" = "yes" -a "$enable_experimental_jit" != "no"; then
|
||||||
|
# GH-133171: This configuration builds the JIT but never actually uses it,
|
||||||
|
# which is surprising (and strictly worse than not building it at all):
|
||||||
136
Yhg1s.gpg
136
Yhg1s.gpg
|
|
@ -1,136 +0,0 @@
|
||||||
-----BEGIN PGP PUBLIC KEY BLOCK-----
|
|
||||||
|
|
||||||
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
|
|
||||||
pX02J8KqWhNsiioO/SAFOhS6+zR+mZghnr5eqD9SHmCKTJ1JWjG2wx2hibaaszQb
|
|
||||||
qypBW1mwoGMDj4MG91iKSnwMgjp3P8xQIyHy/XTAJ1DD9F//2MtQ2ZK5MqiWTYLn
|
|
||||||
iUzirq8M1E8rLHh8Met5xIOq5iIDcMn0HTBCwrWWPOyqTF2lWK3G6LOjTltQ01fJ
|
|
||||||
JaICpTe1Eirt9v+kr1iPLH1+zIeWZ1O469I/nxRp/WW6Oavzb9WRg5gDBKZ2v+rJ
|
|
||||||
jZLcaEBFtCRUaG9tYXMgV291dGVycyA8dHdvdXRlcnNAZ29vZ2xlLmNvbT6JAlQE
|
|
||||||
EwEKAD4CGwMFCwkIBwMFFQoJCAsFFgIDAQACHgECF4AWIQRxaWBfYsdRNW0FSiao
|
|
||||||
IeaA5fpjBQUCYOBlAQUJFUZECwAKCRCoIeaA5fpjBTvxEACfyEt5rN5QGmVgahD/
|
|
||||||
83l7lQpZUzLSq5MnIfRjCz50seh+oWsOuecayHZ79IDVSkF2L2kE1rumcB7UKPez
|
|
||||||
0kHVrTdh3mQIsfCzQZEMsWTDYotlZbrPPvT3lKGL+O7fU321q9GVotJAssYcQFIK
|
|
||||||
9F2p3jhN2coOzguikVlSc4nswnq2KRIJ4BpSJ3fk1rWLr8oJxN2pSpskYtHdUyUx
|
|
||||||
fZ+fOrMHLbW94JWsLYDad4wpr8etBneVAaUPfphhbIwfhRXlHuTreDtwr3LJYKp1
|
|
||||||
VjUjzGVVT2CXkS9LbJ7aM2BYa/1MJyHxkglu8O9LIDGH2arlbtmBKMbCXPSX/42H
|
|
||||||
sGpUgQYRwG4f+2CfPj4fNx5GK8LO/EJjaw2Qh542U0356RRVZquN6E6SS6Sndlf9
|
|
||||||
sO4cKU/ptT8IsfWKKaLwvr0l71hgLRqqe3rSpTV54cKpJfYIG+Qf4Do69etJLxjY
|
|
||||||
UsyCqzuFocxZa0DGkqDQ+f1cD1bdg7Twso041NZG6y9+E7kCf3jtKkiYAHBY902q
|
|
||||||
Zi8FvtI2tDAqwlfJjdiH5rUtYZALO3KGT+l9p3FTYIdDD1iVC41CeF6loJk0gQZi
|
|
||||||
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
|
|
||||||
=t995
|
|
||||||
-----END PGP PUBLIC KEY BLOCK-----
|
|
||||||
23
download-jit-stencils-from-koji.sh
Normal file
23
download-jit-stencils-from-koji.sh
Normal file
|
|
@ -0,0 +1,23 @@
|
||||||
|
set -eu
|
||||||
|
export LANG=C.utf-8
|
||||||
|
|
||||||
|
taskid=$(echo "$1" | sed -E 's/.*=|^([0-9]+)/\1/')
|
||||||
|
filter='.*-debugsource-.*\.(x86_64|aarch64)\.rpm'
|
||||||
|
|
||||||
|
download_stdout=$(koji download-task $taskid --filter "$filter" | tee /dev/stderr)
|
||||||
|
files=$(echo "$download_stdout" | grep -E '^Downloading ' | sed -E 's/.*\s+(\S+)/\1/' | sort)
|
||||||
|
|
||||||
|
for file in $files; do
|
||||||
|
nvra=${file/.rpm}
|
||||||
|
snvra=${nvra/-debugsource}
|
||||||
|
version=$(echo $nvra | sed -E -e 's|.*-([^-]+)-[^-]+|\1|' -e 's|~||')
|
||||||
|
arch=$(echo $nvra | sed -E 's|.*\.([^.]+)|\1|')
|
||||||
|
rpm2cpio $file | cpio -idmv ./usr/src/debug/${snvra}/build/{debug,optimized}/jit_stencils-${arch}-redhat-linux-gnu.h
|
||||||
|
for build in debug optimized; do
|
||||||
|
mv -v ./usr/src/debug/${snvra}/build/${build}/jit_stencils-${arch}-redhat-linux-gnu.h Python-${version}-${arch}-${build}-jit_stencils.h > /dev/stderr
|
||||||
|
echo Python-${version}-${arch}-${build}-jit_stencils.h
|
||||||
|
done
|
||||||
|
rmdir ./usr/src/debug/${snvra}{/build{/{debug,optimized},},} || :
|
||||||
|
rm -v $file > /dev/stderr
|
||||||
|
done
|
||||||
|
rmdir ./usr{/src{/debug,},} || :
|
||||||
93
plan.fmf
Normal file
93
plan.fmf
Normal file
|
|
@ -0,0 +1,93 @@
|
||||||
|
execute:
|
||||||
|
how: tmt
|
||||||
|
|
||||||
|
provision:
|
||||||
|
hardware:
|
||||||
|
memory: '>= 3 GB'
|
||||||
|
|
||||||
|
environment:
|
||||||
|
pybasever: '3.14'
|
||||||
|
|
||||||
|
discover:
|
||||||
|
- name: tests_python
|
||||||
|
how: shell
|
||||||
|
url: https://src.fedoraproject.org/tests/python.git
|
||||||
|
tests:
|
||||||
|
- name: smoke
|
||||||
|
path: /smoke
|
||||||
|
test: "VERSION=${pybasever} CYTHON=true ./venv.sh"
|
||||||
|
- name: smoke_virtualenv
|
||||||
|
path: /smoke
|
||||||
|
test: "VERSION=${pybasever} METHOD=virtualenv CYTHON=true ./venv.sh"
|
||||||
|
- name: debugsmoke
|
||||||
|
path: /smoke
|
||||||
|
test: "PYTHON=python${pybasever}d TOX=false VERSION=${pybasever} CYTHON=true ./venv.sh"
|
||||||
|
- name: selftest
|
||||||
|
path: /selftest
|
||||||
|
test: "VERSION=${pybasever} X='-i test_check_probes' ./parallel.sh"
|
||||||
|
- name: debugtest
|
||||||
|
path: /selftest
|
||||||
|
# test_base_interpreter: https://github.com/python/cpython/issues/131372
|
||||||
|
test: "VERSION=${pybasever} PYTHON=python${pybasever}d X='-i test_check_probes -i test_base_interpreter' ./parallel.sh"
|
||||||
|
- name: freethreadingtest
|
||||||
|
path: /selftest
|
||||||
|
test: "VERSION=${pybasever}t X='-i test_check_probes -i test_base_interpreter' ./parallel.sh"
|
||||||
|
- name: selftest_jit
|
||||||
|
path: /selftest
|
||||||
|
# test_attr_promotion_failure: https://github.com/python/cpython/issues/141833
|
||||||
|
test: "VERSION=${pybasever} PYTHON_JIT=1 X='-i test_check_probes -i test_attr_promotion_failure' ./parallel.sh"
|
||||||
|
- name: jit_disabled_by_default
|
||||||
|
test: "python${pybasever} -c 'import sys; assert not sys._jit.is_enabled()'"
|
||||||
|
- name: jit_disabled_explicitly
|
||||||
|
test: "PYTHON_JIT=0 python${pybasever} -c 'import sys; assert not sys._jit.is_enabled()'"
|
||||||
|
- name: jit_enabled_explicitly
|
||||||
|
test: "PYTHON_JIT=1 python${pybasever} -c 'import sys; assert sys._jit.is_enabled()'"
|
||||||
|
- name: optimizedflags
|
||||||
|
path: /flags
|
||||||
|
test: "python${pybasever} ./assertflags.py -O3 CFLAGS PY_BUILTIN_MODULE_CFLAGS PY_CFLAGS PY_CORE_CFLAGS PY_CFLAGS_NODIST PY_STDMODULE_CFLAGS"
|
||||||
|
- name: debugflags
|
||||||
|
path: /flags
|
||||||
|
test: "python${pybasever}d ./assertflags.py -O0 CFLAGS PY_BUILTIN_MODULE_CFLAGS PY_CFLAGS PY_CORE_CFLAGS PY_CFLAGS_NODIST PY_STDMODULE_CFLAGS"
|
||||||
|
- name: freethreadingflags
|
||||||
|
path: /flags
|
||||||
|
test: "python${pybasever}t ./assertflags.py -O3 CFLAGS PY_BUILTIN_MODULE_CFLAGS PY_CFLAGS PY_CORE_CFLAGS PY_CFLAGS_NODIST PY_STDMODULE_CFLAGS"
|
||||||
|
- name: freethreadingdebugflags
|
||||||
|
path: /flags
|
||||||
|
test: "python${pybasever}td ./assertflags.py -O0 CFLAGS PY_BUILTIN_MODULE_CFLAGS PY_CFLAGS PY_CORE_CFLAGS PY_CFLAGS_NODIST PY_STDMODULE_CFLAGS"
|
||||||
|
- name: marshalparser
|
||||||
|
path: /marshalparser
|
||||||
|
test: "VERSION=${pybasever} SAMPLE=10 ./test_marshalparser_compatibility.sh"
|
||||||
|
- name: required_symbols
|
||||||
|
path: /required-symbols
|
||||||
|
test: "VERSION=${pybasever} ./check.sh"
|
||||||
|
|
||||||
|
prepare:
|
||||||
|
- name: Install dependencies
|
||||||
|
how: install
|
||||||
|
package:
|
||||||
|
- gcc # for extension building in venv and selftest
|
||||||
|
- gcc-c++ # for test_cppext
|
||||||
|
- gdb # for test_gdb
|
||||||
|
- "python${pybasever}" # the test subject
|
||||||
|
- "python${pybasever}-debug" # for leak testing
|
||||||
|
- "python${pybasever}-devel" # for extension building in venv and selftest
|
||||||
|
- "python${pybasever}-tkinter" # for selftest
|
||||||
|
- "python${pybasever}-test" # for selftest
|
||||||
|
- "python${pybasever}-freethreading" # for -O... flag test
|
||||||
|
- "python${pybasever}-freethreading-debug" # for -O... flag test
|
||||||
|
- "python${pybasever}-freethreading-tkinter" # for freethreadingtest
|
||||||
|
- "python${pybasever}-freethreading-test" # for freethreadingtest
|
||||||
|
- tox # for venv tests
|
||||||
|
- virtualenv # for virtualenv tests
|
||||||
|
- glibc-all-langpacks # for locale tests
|
||||||
|
- marshalparser # for testing compatibility (magic numbers) with marshalparser
|
||||||
|
- binutils # for nm (symbol inspection)
|
||||||
|
- rpm # for debugging
|
||||||
|
- dnf # for upgrade and downgrade
|
||||||
|
- name: Update packages
|
||||||
|
how: shell
|
||||||
|
script: dnf upgrade -y
|
||||||
|
- name: rpm_qa
|
||||||
|
order: 100
|
||||||
|
how: shell
|
||||||
|
script: rpm -qa | sort | tee $TMT_PLAN_DATA/rpmqa.txt
|
||||||
794
python3.14.spec
794
python3.14.spec
File diff suppressed because it is too large
Load diff
|
|
@ -1,22 +1,22 @@
|
||||||
# exclude test XML data (not always valid) from XML validity check:
|
# exclude test XML data (not always valid) from XML validity check:
|
||||||
xml:
|
xml:
|
||||||
ignore:
|
ignore:
|
||||||
- /usr/lib*/python*/test/xmltestdata/*
|
- '/usr/lib*/python*/test/xmltestdata/*'
|
||||||
- /usr/lib*/python*/test/xmltestdata/*/*
|
- '/usr/lib*/python*/test/xmltestdata/*/*'
|
||||||
|
|
||||||
# exclude _socket from ipv4 only functions check, it has both ipv4 and ipv6 only
|
# exclude _socket from ipv4 only functions check, it has both ipv4 and ipv6 only
|
||||||
badfuncs:
|
badfuncs:
|
||||||
allowed:
|
allowed:
|
||||||
/usr/lib*/python*/lib-dynload/_socket.*:
|
'/usr/lib*/python*/lib-dynload/_socket.*':
|
||||||
- inet_aton
|
- inet_aton
|
||||||
- inet_ntoa
|
- inet_ntoa
|
||||||
|
|
||||||
# exclude the debug build from annocheck entirely
|
# exclude the debug build from annocheck entirely
|
||||||
annocheck:
|
annocheck:
|
||||||
ignore:
|
ignore:
|
||||||
- /usr/bin/python*d
|
- '/usr/bin/python*d'
|
||||||
- /usr/lib*/libpython*d.so.1.0
|
- '/usr/lib*/libpython*d.so.1.0'
|
||||||
- /usr/lib*/python*/lib-dynload/*.cpython-*d-*-*-*.so
|
- '/usr/lib*/python*/lib-dynload/*.cpython-*d-*-*-*.so'
|
||||||
|
|
||||||
# don't report changed content of compiled files
|
# don't report changed content of compiled files
|
||||||
# that is expected with every toolchain update and not reproducible yet
|
# that is expected with every toolchain update and not reproducible yet
|
||||||
|
|
|
||||||
15
rpmlint.toml
15
rpmlint.toml
|
|
@ -6,7 +6,7 @@ Filters = [
|
||||||
|
|
||||||
|
|
||||||
# TESTS:
|
# TESTS:
|
||||||
'(zero-length|pem-certificate|uncompressed-zip) /usr/lib(64)?/python3\.\d+t?/test',
|
'(zero-length|pem-certificate|uncompressed-zip|file-not-in-%lang) /usr/lib(64)?/python3\.\d+t?/test',
|
||||||
|
|
||||||
|
|
||||||
# OTHER DELIBERATES:
|
# OTHER DELIBERATES:
|
||||||
|
|
@ -21,6 +21,9 @@ Filters = [
|
||||||
'unversioned Obsoletes: Obsoletes: python3\.\d+$',
|
'unversioned Obsoletes: Obsoletes: python3\.\d+$',
|
||||||
'self-obsoletion python3\.\d+(-\S+)? obsoletes python3\.\d+(-\S+)?',
|
'self-obsoletion python3\.\d+(-\S+)? obsoletes python3\.\d+(-\S+)?',
|
||||||
|
|
||||||
|
# freethreading subpackages obsolete python3.X-freethreading, but don't provide it
|
||||||
|
'^python3(\.\d+)?-freethreading(-\w+)?\.[^:]+: (E|W): obsolete-not-provided python3(\.\d+)?-freethreading$',
|
||||||
|
|
||||||
# intentionally hardcoded
|
# intentionally hardcoded
|
||||||
'hardcoded-library-path in %{_prefix}/lib/(debug/%{_libdir}|python%{pybasever})',
|
'hardcoded-library-path in %{_prefix}/lib/(debug/%{_libdir}|python%{pybasever})',
|
||||||
|
|
||||||
|
|
@ -37,6 +40,9 @@ Filters = [
|
||||||
# if this regex needs to be relaxed in the future, make sure it **does not** match pyc files in __pycache__
|
# if this regex needs to be relaxed in the future, make sure it **does not** match pyc files in __pycache__
|
||||||
'python-bytecode-without-source /usr/lib(64)?/python3\.\d+t?/(encodings|pydoc_data)/[^/]+.pyc',
|
'python-bytecode-without-source /usr/lib(64)?/python3\.\d+t?/(encodings|pydoc_data)/[^/]+.pyc',
|
||||||
|
|
||||||
|
# https://docs.fedoraproject.org/en-US/packaging-guidelines/RPM_Source_Dir/#_exceptions
|
||||||
|
'use-of-RPM_SOURCE_DIR',
|
||||||
|
|
||||||
# DUPLICATE FILES
|
# DUPLICATE FILES
|
||||||
# test data are often duplicated
|
# test data are often duplicated
|
||||||
'(E|W): files-duplicate /usr/lib(64)?/python3\.\d+t?/(test|__phello__)/',
|
'(E|W): files-duplicate /usr/lib(64)?/python3\.\d+t?/(test|__phello__)/',
|
||||||
|
|
@ -55,7 +61,10 @@ Filters = [
|
||||||
'no-manual-page-for-binary python3\.\d+t?dm?$',
|
'no-manual-page-for-binary python3\.\d+t?dm?$',
|
||||||
|
|
||||||
# missing documentation from subpackages
|
# missing documentation from subpackages
|
||||||
'^python3(\.\d+)?-(freethreading(-debug)?|debug|tkinter|test|idle)\.[^:]+: (E|W): no-documentation',
|
'^python3(\.\d+)?-(freethreading(-\w+)?|debug|tkinter|test|idle)\.[^:]+: (E|W): no-documentation',
|
||||||
|
|
||||||
|
# idle subpackages have no binaries
|
||||||
|
'^python3(\.\d+)?-(freethreading-)?idle\.[^:]+: (E|W): no-binary',
|
||||||
|
|
||||||
# platform python is obsoleted, but not provided
|
# platform python is obsoleted, but not provided
|
||||||
'obsolete-not-provided platform-python',
|
'obsolete-not-provided platform-python',
|
||||||
|
|
@ -101,6 +110,6 @@ Filters = [
|
||||||
'\bpython3(\.\d+)?\.(src|spec): (E|W): specfile-error\s+$',
|
'\bpython3(\.\d+)?\.(src|spec): (E|W): specfile-error\s+$',
|
||||||
|
|
||||||
# SPELLING ERRORS
|
# SPELLING ERRORS
|
||||||
'spelling-error .* en_US (bytecode|pyc|filename|tkinter|namespaces|pytest|unittest|gil) ',
|
'spelling-error .*\b(bytecode|pyc|filename|tkinter|namespaces|pytest|unittest|gil|CPython)\b',
|
||||||
|
|
||||||
]
|
]
|
||||||
|
|
|
||||||
6
sources
6
sources
|
|
@ -1 +1,5 @@
|
||||||
SHA512 (Python-3.14.0a2.tar.xz) = face78a7ef5d1a14b7e8c478125c660fe9745e793a5443932684c8426f0023324236c67ad73198e4286ba8793628452ae4d4d6332f007c009b285ba83ca1fc48
|
SHA512 (Python-3.14.7.tar.xz) = 3d4e2e2f983b320dec47005c408d7178d3656a6de0c4430ce21514797174b972f461200898b25d3dfac2a455019ef87e45d0fb2bb6ec2ca887124d10037a2a07
|
||||||
|
SHA512 (Python-3.14.7-aarch64-debug-jit_stencils.h) = 85bf4cdf5996ede2932aa1b5ffb0c3befe7fb395efdadaeedc05969bbf8f4db1fe825666276239183ec24caa58f2307983876b29efa86ac54bd5802c85ab1d3c
|
||||||
|
SHA512 (Python-3.14.7-aarch64-optimized-jit_stencils.h) = e7245f166126184655275dd5a90a4251e73ed042fc0d9b46624f55faa698a676a6714f8d2577aecd0a03fb54a6fda3d23b1391a1872b66c130b79b817699ab82
|
||||||
|
SHA512 (Python-3.14.7-x86_64-debug-jit_stencils.h) = e34b31bcc3959b3fbd9cac07df69eababfab2ff42101a0dc14af34c67775c73ef48dcac658ac0c1f58c8c2957bd88a553a748f849e566d4cf66c0a5d9722f14d
|
||||||
|
SHA512 (Python-3.14.7-x86_64-optimized-jit_stencils.h) = d17bf0d61136580dfe589dbcac2d51bbb3fa75f467e008ad2000a7f778427f32aef3f88efb46a1c01c4aa4af8878d51d4f4e0b1d18976906ea332bfe6c11e1fe
|
||||||
|
|
|
||||||
|
|
@ -1,4 +0,0 @@
|
||||||
---
|
|
||||||
standard-inventory-qcow2:
|
|
||||||
qemu:
|
|
||||||
m: 3G # Amount of VM memory
|
|
||||||
|
|
@ -1,67 +0,0 @@
|
||||||
---
|
|
||||||
- hosts: localhost
|
|
||||||
tags:
|
|
||||||
- classic
|
|
||||||
tasks:
|
|
||||||
- dnf:
|
|
||||||
name: "*"
|
|
||||||
state: latest
|
|
||||||
|
|
||||||
- hosts: localhost
|
|
||||||
roles:
|
|
||||||
- role: standard-test-basic
|
|
||||||
tags:
|
|
||||||
- classic
|
|
||||||
repositories:
|
|
||||||
- repo: "https://src.fedoraproject.org/tests/python.git"
|
|
||||||
dest: "python"
|
|
||||||
pybasever: "3.14"
|
|
||||||
tests:
|
|
||||||
- rpm_qa:
|
|
||||||
run: rpm -qa
|
|
||||||
- smoke:
|
|
||||||
dir: python/smoke
|
|
||||||
run: "VERSION={{ pybasever }} CYTHON=false ./venv.sh"
|
|
||||||
- smoke_virtualenv:
|
|
||||||
dir: python/smoke
|
|
||||||
run: "VERSION={{ pybasever }} METHOD=virtualenv CYTHON=false ./venv.sh"
|
|
||||||
- debugsmoke:
|
|
||||||
dir: python/smoke
|
|
||||||
run: "PYTHON=python{{ pybasever }}d TOX=false VERSION={{ pybasever }} CYTHON=false ./venv.sh"
|
|
||||||
- selftest:
|
|
||||||
dir: python/selftest
|
|
||||||
run: "VERSION={{ pybasever }} X='-i test_check_probes' ./parallel.sh"
|
|
||||||
- debugtest:
|
|
||||||
dir: python/selftest
|
|
||||||
run: "VERSION={{ pybasever }} PYTHON=python{{ pybasever }}d X='-i test_check_probes' ./parallel.sh"
|
|
||||||
- optimizedflags:
|
|
||||||
dir: python/flags
|
|
||||||
run: "python{{ pybasever }} ./assertflags.py -O3 CFLAGS PY_BUILTIN_MODULE_CFLAGS PY_CFLAGS PY_CORE_CFLAGS PY_CFLAGS_NODIST PY_STDMODULE_CFLAGS"
|
|
||||||
- debugflags:
|
|
||||||
dir: python/flags
|
|
||||||
run: "python{{ pybasever }}d ./assertflags.py -O0 CFLAGS PY_BUILTIN_MODULE_CFLAGS PY_CFLAGS PY_CORE_CFLAGS PY_CFLAGS_NODIST PY_STDMODULE_CFLAGS"
|
|
||||||
- freethreadingflags:
|
|
||||||
dir: python/flags
|
|
||||||
run: "python{{ pybasever }}t ./assertflags.py -O3 CFLAGS PY_BUILTIN_MODULE_CFLAGS PY_CFLAGS PY_CORE_CFLAGS PY_CFLAGS_NODIST PY_STDMODULE_CFLAGS"
|
|
||||||
- freethreadingdebugflags:
|
|
||||||
dir: python/flags
|
|
||||||
run: "python{{ pybasever }}td ./assertflags.py -O0 CFLAGS PY_BUILTIN_MODULE_CFLAGS PY_CFLAGS PY_CORE_CFLAGS PY_CFLAGS_NODIST PY_STDMODULE_CFLAGS"
|
|
||||||
- marshalparser:
|
|
||||||
dir: python/marshalparser
|
|
||||||
run: "VERSION={{ pybasever }} SAMPLE=10 test_marshalparser_compatibility.sh"
|
|
||||||
required_packages:
|
|
||||||
- gcc # for extension building in venv and selftest
|
|
||||||
- gcc-c++ # for test_cppext
|
|
||||||
- gdb # for test_gdb
|
|
||||||
- "python{{ pybasever }}" # the test subject
|
|
||||||
- "python{{ pybasever }}-debug" # for leak testing
|
|
||||||
- "python{{ pybasever }}-devel" # for extension building in venv and selftest
|
|
||||||
- "python{{ pybasever }}-tkinter" # for selftest
|
|
||||||
- "python{{ pybasever }}-test" # for selftest
|
|
||||||
- "python{{ pybasever }}-freethreading" # for -O... flag test
|
|
||||||
- "python{{ pybasever }}-freethreading-debug" # for -O... flag test
|
|
||||||
- tox # for venv tests
|
|
||||||
- virtualenv # for virtualenv tests
|
|
||||||
- glibc-all-langpacks # for locale tests
|
|
||||||
- marshalparser # for testing compatibility (magic numbers) with marshalparser
|
|
||||||
- rpm # for debugging
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue