Compare commits
No commits in common. "rawhide" and "f38" have entirely different histories.
13 changed files with 509 additions and 1108 deletions
|
|
@ -1,7 +1,7 @@
|
|||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Miro=20Hron=C4=8Dok?= <miro@hroncok.cz>
|
||||
Date: Mon, 15 Feb 2021 12:19:27 +0100
|
||||
Subject: 00251: Change user install location
|
||||
Subject: [PATCH] 00251: Change user install location
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
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(-)
|
||||
|
||||
diff --git a/Lib/site.py b/Lib/site.py
|
||||
index 041dca113a..ca6320df2f 100644
|
||||
index b63447d667..2476b1a484 100644
|
||||
--- a/Lib/site.py
|
||||
+++ b/Lib/site.py
|
||||
@@ -415,8 +415,15 @@ def getsitepackages(prefixes=None):
|
||||
@@ -404,8 +404,15 @@ def getsitepackages(prefixes=None):
|
||||
return sitepackages
|
||||
|
||||
def addsitepackages(known_paths, prefixes=None):
|
||||
|
|
@ -51,7 +51,7 @@ index 041dca113a..ca6320df2f 100644
|
|||
if os.path.isdir(sitedir):
|
||||
addsitedir(sitedir, known_paths)
|
||||
diff --git a/Lib/sysconfig/__init__.py b/Lib/sysconfig/__init__.py
|
||||
index 43edebce34..40e85568ea 100644
|
||||
index 98a14e5d3a..8369073fee 100644
|
||||
--- a/Lib/sysconfig/__init__.py
|
||||
+++ b/Lib/sysconfig/__init__.py
|
||||
@@ -106,6 +106,12 @@
|
||||
|
|
@ -87,7 +87,7 @@ index 43edebce34..40e85568ea 100644
|
|||
_SCHEME_KEYS = ('stdlib', 'platstdlib', 'purelib', 'platlib', 'include',
|
||||
'scripts', 'data')
|
||||
|
||||
@@ -266,11 +285,40 @@ def _extend_dict(target_dict, other_dict):
|
||||
@@ -261,11 +280,40 @@ def _extend_dict(target_dict, other_dict):
|
||||
target_dict[key] = value
|
||||
|
||||
|
||||
|
|
@ -120,7 +120,7 @@ index 43edebce34..40e85568ea 100644
|
|||
+ # we only change the defaults here, so explicit --prefix will take precedence
|
||||
+ # https://fedoraproject.org/wiki/Changes/Making_sudo_pip_safe
|
||||
+ if (scheme == 'posix_prefix' and
|
||||
+ sys.prefix == '/usr' and
|
||||
+ _PREFIX == '/usr' and
|
||||
+ 'RPM_BUILD_ROOT' not in os.environ):
|
||||
+ _extend_dict(vars, _config_vars_local())
|
||||
+ else:
|
||||
|
|
@ -130,10 +130,10 @@ index 43edebce34..40e85568ea 100644
|
|||
# On Windows we want to substitute 'lib' for schemes rather
|
||||
# than the native value (without modifying vars, in case it
|
||||
diff --git a/Lib/test/test_sysconfig.py b/Lib/test/test_sysconfig.py
|
||||
index ce17206a3c..fd95071099 100644
|
||||
index 9233304c6a..4acaad5ed6 100644
|
||||
--- a/Lib/test/test_sysconfig.py
|
||||
+++ b/Lib/test/test_sysconfig.py
|
||||
@@ -130,8 +130,19 @@ def test_get_path(self):
|
||||
@@ -121,8 +121,19 @@ def test_get_path(self):
|
||||
for scheme in _INSTALL_SCHEMES:
|
||||
for name in _INSTALL_SCHEMES[scheme]:
|
||||
expected = _INSTALL_SCHEMES[scheme][name].format(**config_vars)
|
||||
|
|
@ -154,7 +154,7 @@ index ce17206a3c..fd95071099 100644
|
|||
os.path.normpath(expected),
|
||||
)
|
||||
|
||||
@@ -395,7 +406,7 @@ def test_get_config_h_filename(self):
|
||||
@@ -377,7 +388,7 @@ def test_get_config_h_filename(self):
|
||||
self.assertTrue(os.path.isfile(config_h), config_h)
|
||||
|
||||
def test_get_scheme_names(self):
|
||||
|
|
@ -163,7 +163,7 @@ index ce17206a3c..fd95071099 100644
|
|||
if HAS_USER_BASE:
|
||||
wanted.extend(['nt_user', 'osx_framework_user', 'posix_user'])
|
||||
self.assertEqual(get_scheme_names(), tuple(sorted(wanted)))
|
||||
@@ -407,6 +418,8 @@ def test_symlink(self): # Issue 7880
|
||||
@@ -389,6 +400,8 @@ def test_symlink(self): # Issue 7880
|
||||
cmd = "-c", "import sysconfig; print(sysconfig.get_platform())"
|
||||
self.assertEqual(py.call_real(*cmd), py.call_link(*cmd))
|
||||
|
||||
|
|
|
|||
58
00428-gh-118846-fix-pgo-tests-in-free-threaded-build.patch
Normal file
58
00428-gh-118846-fix-pgo-tests-in-free-threaded-build.patch
Normal file
|
|
@ -0,0 +1,58 @@
|
|||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Sam Gross <colesbury@gmail.com>
|
||||
Date: Thu, 9 May 2024 16:06:20 -0400
|
||||
Subject: [PATCH] 00428: gh-118846: Fix PGO tests in free-threaded build
|
||||
|
||||
Avoid immortalizing objects in tests that verify garbage collection of
|
||||
classes or modules.
|
||||
|
||||
This fixes test_ordered_dict and test_struct.
|
||||
|
||||
(cherry picked from commit 1b1db2fd9a531e26b79b34667bccfb938c4d184d)
|
||||
---
|
||||
Lib/test/test_ordered_dict.py | 3 ++-
|
||||
Lib/test/test_struct.py | 3 ++-
|
||||
2 files changed, 4 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/Lib/test/test_ordered_dict.py b/Lib/test/test_ordered_dict.py
|
||||
index 4571b23dfe..06a0e81227 100644
|
||||
--- a/Lib/test/test_ordered_dict.py
|
||||
+++ b/Lib/test/test_ordered_dict.py
|
||||
@@ -10,7 +10,7 @@
|
||||
import weakref
|
||||
from collections.abc import MutableMapping
|
||||
from test import mapping_tests, support
|
||||
-from test.support import import_helper
|
||||
+from test.support import import_helper, suppress_immortalization
|
||||
|
||||
|
||||
py_coll = import_helper.import_fresh_module('collections',
|
||||
@@ -667,6 +667,7 @@ def test_dict_update(self):
|
||||
dict.update(od, [('spam', 1)])
|
||||
self.assertNotIn('NULL', repr(od))
|
||||
|
||||
+ @suppress_immortalization()
|
||||
def test_reference_loop(self):
|
||||
# Issue 25935
|
||||
OrderedDict = self.OrderedDict
|
||||
diff --git a/Lib/test/test_struct.py b/Lib/test/test_struct.py
|
||||
index 15f6ee06ff..5508cc3eec 100644
|
||||
--- a/Lib/test/test_struct.py
|
||||
+++ b/Lib/test/test_struct.py
|
||||
@@ -9,7 +9,7 @@
|
||||
import weakref
|
||||
|
||||
from test import support
|
||||
-from test.support import import_helper
|
||||
+from test.support import import_helper, suppress_immortalization
|
||||
from test.support.script_helper import assert_python_ok
|
||||
|
||||
ISBIGENDIAN = sys.byteorder == "big"
|
||||
@@ -674,6 +674,7 @@ def __del__(self):
|
||||
self.assertIn(b"Exception ignored in:", stderr)
|
||||
self.assertIn(b"C.__del__", stderr)
|
||||
|
||||
+ @suppress_immortalization()
|
||||
def test__struct_reference_cycle_cleaned_up(self):
|
||||
# Regression test for python/cpython#94207.
|
||||
|
||||
|
|
@ -1,133 +0,0 @@
|
|||
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 ae7cec6540..7f73a8c5e7 100644
|
||||
--- a/Lib/test/test_pyexpat.py
|
||||
+++ b/Lib/test/test_pyexpat.py
|
||||
@@ -1001,7 +1001,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)
|
||||
@@ -1010,7 +1010,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')
|
||||
|
||||
@@ -1041,7 +1041,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 9b3014a94a..0e38c9488e 100644
|
||||
--- a/Lib/test/test_sax.py
|
||||
+++ b/Lib/test/test_sax.py
|
||||
@@ -1215,7 +1215,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):
|
||||
@@ -1249,7 +1249,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 4a76a5be1e..effb899d7b 100644
|
||||
--- a/Lib/test/test_xml_etree.py
|
||||
+++ b/Lib/test/test_xml_etree.py
|
||||
@@ -1804,7 +1804,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):
|
||||
@@ -1834,7 +1834,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 9e5d84eb5e..b008fe66c1 100644
|
||||
--- a/Modules/pyexpat.c
|
||||
+++ b/Modules/pyexpat.c
|
||||
@@ -781,7 +781,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
|
||||
@@ -1446,7 +1446,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;
|
||||
@@ -2332,7 +2332,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;
|
||||
|
|
@ -1,59 +0,0 @@
|
|||
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
|
||||
|
||||
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 eb6dab4015..bd621caee4 100644
|
||||
--- a/Lib/test/test_poplib.py
|
||||
+++ b/Lib/test/test_poplib.py
|
||||
@@ -18,6 +18,7 @@
|
||||
from test.support import asynchat
|
||||
from test.support import asyncore
|
||||
from test.support.testcase import ExtraAssertions
|
||||
+from test.support import control_characters_c0
|
||||
|
||||
|
||||
test_support.requires_working_socket(module=True)
|
||||
@@ -396,6 +397,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.
|
||||
|
|
@ -1,173 +0,0 @@
|
|||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Petr Viktorin <encukou@gmail.com>
|
||||
Date: Mon, 9 Feb 2026 10:44:21 +0100
|
||||
Subject: 00477: Raise an error when importing stdlib modules compiled for a
|
||||
different Python version
|
||||
|
||||
This is a downstream workaround "implementing" python#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.
|
||||
|
||||
_curses, _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/_cursesmodule.c | 6 ++++++
|
||||
Modules/_tkinter.c | 6 ++++++
|
||||
Modules/_tracemalloc.c | 6 ++++++
|
||||
Modules/readline.c | 6 ++++++
|
||||
Objects/moduleobject.c | 1 +
|
||||
7 files changed, 71 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 2363b99a25..f1a07645f0 100644
|
||||
--- a/Makefile.pre.in
|
||||
+++ b/Makefile.pre.in
|
||||
@@ -3159,3 +3159,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/_cursesmodule.c b/Modules/_cursesmodule.c
|
||||
index 1996488a0e..cfdffd8ec4 100644
|
||||
--- a/Modules/_cursesmodule.c
|
||||
+++ b/Modules/_cursesmodule.c
|
||||
@@ -5011,6 +5011,12 @@ curses_destructor(PyObject *op)
|
||||
PyMODINIT_FUNC
|
||||
PyInit__curses(void)
|
||||
{
|
||||
+ #ifdef _PyHack_check_version_on_modinit
|
||||
+ if (_PyHack_CheckInternalAPIVersion("_curses") < 0) {
|
||||
+ return NULL;
|
||||
+ }
|
||||
+ #endif
|
||||
+
|
||||
PyObject *m, *d, *v, *c_api_object;
|
||||
|
||||
/* Initialize object type */
|
||||
diff --git a/Modules/_tkinter.c b/Modules/_tkinter.c
|
||||
index 4e8d75e8e1..32e58755aa 100644
|
||||
--- a/Modules/_tkinter.c
|
||||
+++ b/Modules/_tkinter.c
|
||||
@@ -3499,6 +3499,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 0b85187e5f..87f358ed07 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 *m;
|
||||
m = PyModule_Create(&module_def);
|
||||
if (m == NULL)
|
||||
diff --git a/Modules/readline.c b/Modules/readline.c
|
||||
index 7a612deae4..8b2f47eec1 100644
|
||||
--- a/Modules/readline.c
|
||||
+++ b/Modules/readline.c
|
||||
@@ -1548,6 +1548,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 d787f29004..31175ceb3f 100644
|
||||
--- a/Objects/moduleobject.c
|
||||
+++ b/Objects/moduleobject.c
|
||||
@@ -43,6 +43,7 @@ _PyModule_IsExtension(PyObject *obj)
|
||||
}
|
||||
|
||||
|
||||
+#undef PyModuleDef_Init
|
||||
PyObject*
|
||||
PyModuleDef_Init(PyModuleDef* def)
|
||||
{
|
||||
77
plan.fmf
77
plan.fmf
|
|
@ -1,77 +0,0 @@
|
|||
execute:
|
||||
how: tmt
|
||||
|
||||
provision:
|
||||
hardware:
|
||||
memory: '>= 3 GB'
|
||||
|
||||
environment:
|
||||
pybasever: '3.13'
|
||||
|
||||
discover:
|
||||
- name: tests_python
|
||||
how: shell
|
||||
url: https://src.fedoraproject.org/tests/python.git
|
||||
tests:
|
||||
- name: smoke
|
||||
path: /smoke
|
||||
test: "VERSION=${pybasever} CYTHON=false ./venv.sh"
|
||||
- name: smoke_virtualenv
|
||||
path: /smoke
|
||||
test: "VERSION=${pybasever} METHOD=virtualenv CYTHON=false ./venv.sh"
|
||||
- name: debugsmoke
|
||||
path: /smoke
|
||||
test: "PYTHON=python${pybasever}d TOX=false VERSION=${pybasever} CYTHON=false ./venv.sh"
|
||||
- name: selftest
|
||||
path: /selftest
|
||||
test: "VERSION=${pybasever} X='-i test_check_probes' ./parallel.sh"
|
||||
- name: debugtest
|
||||
path: /selftest
|
||||
test: "VERSION=${pybasever} PYTHON=python${pybasever}d X='-i test_check_probes' ./parallel.sh"
|
||||
- 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
|
||||
- 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
|
||||
996
python3.13.spec
996
python3.13.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:
|
||||
xml:
|
||||
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
|
||||
badfuncs:
|
||||
allowed:
|
||||
'/usr/lib*/python*/lib-dynload/_socket.*':
|
||||
/usr/lib*/python*/lib-dynload/_socket.*:
|
||||
- inet_aton
|
||||
- inet_ntoa
|
||||
|
||||
# exclude the debug build from annocheck entirely
|
||||
annocheck:
|
||||
ignore:
|
||||
- '/usr/bin/python*d'
|
||||
- '/usr/lib*/libpython*d.so.1.0'
|
||||
- '/usr/lib*/python*/lib-dynload/*.cpython-*d-*-*-*.so'
|
||||
- /usr/bin/python*d
|
||||
- /usr/lib*/libpython*d.so.1.0
|
||||
- /usr/lib*/python*/lib-dynload/*.cpython-*d-*-*-*.so
|
||||
|
||||
# don't report changed content of compiled files
|
||||
# that is expected with every toolchain update and not reproducible yet
|
||||
|
|
|
|||
16
rpmlint.toml
16
rpmlint.toml
|
|
@ -6,7 +6,7 @@ Filters = [
|
|||
|
||||
|
||||
# TESTS:
|
||||
'(zero-length|pem-certificate|uncompressed-zip) /usr/lib(64)?/python3\.\d+t?/test',
|
||||
'(zero-length|pem-certificate|uncompressed-zip) /usr/lib(64)?/python3\.\d+/test',
|
||||
|
||||
|
||||
# OTHER DELIBERATES:
|
||||
|
|
@ -14,7 +14,7 @@ Filters = [
|
|||
'missing-call-to-chdir-with-chroot',
|
||||
|
||||
# gethostbyname function calls gethostbyname
|
||||
'(E|W): binary-or-shlib-calls-gethostbyname /usr/lib(64)?/python3\.\d+t?/lib-dynload/_socket\.',
|
||||
'(E|W): binary-or-shlib-calls-gethostbyname /usr/lib(64)?/python3\.\d+/lib-dynload/_socket\.',
|
||||
|
||||
# intentionally unversioned and selfobsoleted
|
||||
'unversioned-explicit-obsoletes python',
|
||||
|
|
@ -28,18 +28,18 @@ Filters = [
|
|||
'only-non-binary-in-usr-lib',
|
||||
|
||||
# some devel files that are deliberately needed
|
||||
'devel-file-in-non-devel-package /usr/include/python3\.\d+m?t?/pyconfig-(32|64)\.h',
|
||||
'devel-file-in-non-devel-package /usr/lib(64)?/python3\.\d+t?/distutils/tests/xxmodule\.c',
|
||||
'devel-file-in-non-devel-package /usr/include/python3\.\d+m?/pyconfig-(32|64)\.h',
|
||||
'devel-file-in-non-devel-package /usr/lib(64)?/python3\.\d+/distutils/tests/xxmodule\.c',
|
||||
# ...or are used as test data
|
||||
'devel-file-in-non-devel-package /usr/lib(64)?/python3\.\d+t?/test',
|
||||
'devel-file-in-non-devel-package /usr/lib(64)?/python3\.\d+/test',
|
||||
|
||||
# some bytecode is shipped without sources on purpose, as a space optimization
|
||||
# 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+/(encodings|pydoc_data)/[^/]+.pyc',
|
||||
|
||||
# DUPLICATE FILES
|
||||
# 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+/(test|__phello__)/',
|
||||
# duplicated inits or mains are also common
|
||||
'(E|W): files-duplicate .+__init__\.py.+__init__\.py',
|
||||
'(E|W): files-duplicate .+__main__\.py.+__main__\.py',
|
||||
|
|
@ -101,6 +101,6 @@ Filters = [
|
|||
'\bpython3(\.\d+)?\.(src|spec): (E|W): specfile-error\s+$',
|
||||
|
||||
# SPELLING ERRORS
|
||||
'spelling-error .* en_US (bytecode|pyc|filename|tkinter|namespaces|pytest|unittest|gil) ',
|
||||
'spelling-error .* en_US (bytecode|pyc|filename|tkinter|namespaces|pytest) ',
|
||||
|
||||
]
|
||||
|
|
|
|||
4
sources
4
sources
|
|
@ -1,2 +1,2 @@
|
|||
SHA512 (Python-3.13.15.tar.xz) = b0ab766a3de0b4cfdbf0b93300d7330c734d3f7057577bb03e95e39da4cdade81993e769c7fa6dfdcc13b9d43a3b399d9cd89b5477b413662e9e691c1b7886b8
|
||||
SHA512 (Python-3.13.15.tar.xz.asc) = 662c00be95f62e80db43cf42099fef91f764ff7a4433cadf7eb19dedb5e4775adb12878d5ed2295fcea187731de186163ad9672ab72cde62a2335ca58ec1ad86
|
||||
SHA512 (Python-3.13.0b1.tar.xz) = 81cc1d8691bfcc8f8bb232ea15c18039d0df036f5cbc1667fec3b6c34cdf198bed97418ec775c037778c250b7bc4f35bd5fb938dd478cc17fc48c74b8a2b2d19
|
||||
SHA512 (Python-3.13.0b1.tar.xz.asc) = c10832b5016ad9a9588b7efd29a35272c1c07b444df116c397fed82d66f30150687d68a6853637094be2fe1d8ed0928a9cd151617c91d9eb9938ba1385bd7143
|
||||
|
|
|
|||
4
tests/provision.fmf
Normal file
4
tests/provision.fmf
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
---
|
||||
standard-inventory-qcow2:
|
||||
qemu:
|
||||
m: 3G # Amount of VM memory
|
||||
67
tests/tests.yml
Normal file
67
tests/tests.yml
Normal file
|
|
@ -0,0 +1,67 @@
|
|||
---
|
||||
- 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.13"
|
||||
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"
|
||||
- debugflags:
|
||||
dir: python/flags
|
||||
run: "python{{ pybasever }}d ./assertflags.py -O0"
|
||||
- freethreadingflags:
|
||||
dir: python/flags
|
||||
run: "python{{ pybasever }}t ./assertflags.py -O3"
|
||||
- freethreadingdebugflags:
|
||||
dir: python/flags
|
||||
run: "python{{ pybasever }}td ./assertflags.py -O0"
|
||||
- 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