From 066c2585871071aee13f704b361e2dc6b56e9574 Mon Sep 17 00:00:00 2001 From: Miro Hrončok Date: May 02 2018 10:02:18 +0000 Subject: Update to version 2.7.15 - Rebased patches: 165, 170, 198 - Refactored patches: 289 - Removed patches (included upstream): 280, 283, 284, 285, 287, 293, 297, 298, 299 --- diff --git a/00165-crypt-module-salt-backport.patch b/00165-crypt-module-salt-backport.patch index 4308b4c..0040aae 100644 --- a/00165-crypt-module-salt-backport.patch +++ b/00165-crypt-module-salt-backport.patch @@ -1,6 +1,7 @@ -diff -up Python-2.7.3/Doc/library/crypt.rst.crypt-module-salt-backport Python-2.7.3/Doc/library/crypt.rst ---- Python-2.7.3/Doc/library/crypt.rst.crypt-module-salt-backport 2012-04-09 19:07:28.000000000 -0400 -+++ Python-2.7.3/Doc/library/crypt.rst 2013-02-19 16:44:20.465334062 -0500 +diff --git a/Doc/library/crypt.rst b/Doc/library/crypt.rst +index 91464ef..6ee64d6 100644 +--- a/Doc/library/crypt.rst ++++ b/Doc/library/crypt.rst @@ -16,9 +16,9 @@ This module implements an interface to the :manpage:`crypt(3)` routine, which is @@ -14,7 +15,7 @@ diff -up Python-2.7.3/Doc/library/crypt.rst.crypt-module-salt-backport Python-2. .. index:: single: crypt(3) -@@ -27,15 +27,81 @@ the :manpage:`crypt(3)` routine in the r +@@ -27,15 +27,81 @@ the :manpage:`crypt(3)` routine in the running system. Therefore, any extensions available on the current implementation will also be available on this module. @@ -130,7 +131,7 @@ diff -up Python-2.7.3/Doc/library/crypt.rst.crypt-module-salt-backport Python-2. A simple example illustrating typical use:: import crypt, getpass, pwd -@@ -59,3 +146,11 @@ A simple example illustrating typical us +@@ -59,3 +146,11 @@ A simple example illustrating typical use:: else: return 1 @@ -142,9 +143,11 @@ diff -up Python-2.7.3/Doc/library/crypt.rst.crypt-module-salt-backport Python-2. + hashed = crypt.crypt(plaintext) + if hashed != crypt.crypt(plaintext, hashed): + raise "Hashed version doesn't validate against original" -diff -up Python-2.7.3/Lib/crypt.py.crypt-module-salt-backport Python-2.7.3/Lib/crypt.py ---- Python-2.7.3/Lib/crypt.py.crypt-module-salt-backport 2013-02-19 16:44:20.465334062 -0500 -+++ Python-2.7.3/Lib/crypt.py 2013-02-19 16:49:56.425311089 -0500 +diff --git a/Lib/crypt.py b/Lib/crypt.py +new file mode 100644 +index 0000000..bf0a416 +--- /dev/null ++++ b/Lib/crypt.py @@ -0,0 +1,71 @@ +"""Wrapper to the POSIX crypt library call and associated functionality. + @@ -217,12 +220,13 @@ diff -up Python-2.7.3/Lib/crypt.py.crypt-module-salt-backport Python-2.7.3/Lib/c +methods.append(METHOD_CRYPT) +del _result, _method + -diff -up Python-2.7.3/Lib/test/test_crypt.py.crypt-module-salt-backport Python-2.7.3/Lib/test/test_crypt.py ---- Python-2.7.3/Lib/test/test_crypt.py.crypt-module-salt-backport 2012-04-09 19:07:31.000000000 -0400 -+++ Python-2.7.3/Lib/test/test_crypt.py 2013-02-19 16:44:20.465334062 -0500 -@@ -10,6 +10,25 @@ class CryptTestCase(unittest.TestCase): - if test_support.verbose: - print 'Test encryption: ', c +diff --git a/Lib/test/test_crypt.py b/Lib/test/test_crypt.py +index 7cd9c71..b061a55 100644 +--- a/Lib/test/test_crypt.py ++++ b/Lib/test/test_crypt.py +@@ -16,6 +16,25 @@ class CryptTestCase(unittest.TestCase): + self.assertEqual(cr2, cr) + + def test_salt(self): + self.assertEqual(len(crypt._saltchars), 64) @@ -246,9 +250,23 @@ diff -up Python-2.7.3/Lib/test/test_crypt.py.crypt-module-salt-backport Python-2 def test_main(): test_support.run_unittest(CryptTestCase) -diff -up Python-2.7.3/Modules/cryptmodule.c.crypt-module-salt-backport Python-2.7.3/Modules/cryptmodule.c ---- Python-2.7.3/Modules/cryptmodule.c.crypt-module-salt-backport 2012-04-09 19:07:34.000000000 -0400 -+++ Python-2.7.3/Modules/cryptmodule.c 2013-02-19 16:44:20.466334063 -0500 +diff --git a/Modules/Setup.dist b/Modules/Setup.dist +index 2712f06..3ea4f0c 100644 +--- a/Modules/Setup.dist ++++ b/Modules/Setup.dist +@@ -225,7 +225,7 @@ _ssl _ssl.c \ + # + # First, look at Setup.config; configure may have set this for you. + +-crypt cryptmodule.c # -lcrypt # crypt(3); needs -lcrypt on some systems ++_crypt _cryptmodule.c -lcrypt # crypt(3); needs -lcrypt on some systems + + + # Some more UNIX dependent modules -- off by default, since these +diff --git a/Modules/cryptmodule.c b/Modules/cryptmodule.c +index 76de54f..7c69ca6 100644 +--- a/Modules/cryptmodule.c ++++ b/Modules/cryptmodule.c @@ -43,7 +43,7 @@ static PyMethodDef crypt_methods[] = { }; @@ -259,22 +277,11 @@ diff -up Python-2.7.3/Modules/cryptmodule.c.crypt-module-salt-backport Python-2. - Py_InitModule("crypt", crypt_methods); + Py_InitModule("_crypt", crypt_methods); } -diff -up Python-2.7.3/Modules/Setup.dist.crypt-module-salt-backport Python-2.7.3/Modules/Setup.dist ---- Python-2.7.3/Modules/Setup.dist.crypt-module-salt-backport 2013-02-19 16:44:20.463334063 -0500 -+++ Python-2.7.3/Modules/Setup.dist 2013-02-19 16:44:20.466334063 -0500 -@@ -221,7 +221,7 @@ _ssl _ssl.c \ - # - # First, look at Setup.config; configure may have set this for you. - --crypt cryptmodule.c # -lcrypt # crypt(3); needs -lcrypt on some systems -+_crypt _cryptmodule.c -lcrypt # crypt(3); needs -lcrypt on some systems - - - # Some more UNIX dependent modules -- off by default, since these -diff -up Python-2.7.3/setup.py.crypt-module-salt-backport Python-2.7.3/setup.py ---- Python-2.7.3/setup.py.crypt-module-salt-backport 2013-02-19 16:44:20.425334067 -0500 -+++ Python-2.7.3/setup.py 2013-02-19 16:44:20.466334063 -0500 -@@ -693,7 +693,7 @@ class PyBuildExt(build_ext): +diff --git a/setup.py b/setup.py +index b787487..c60ac35 100644 +--- a/setup.py ++++ b/setup.py +@@ -798,7 +798,7 @@ class PyBuildExt(build_ext): libs = ['crypt'] else: libs = [] diff --git a/00170-gc-assertions.patch b/00170-gc-assertions.patch index f3a0838..9ade298 100644 --- a/00170-gc-assertions.patch +++ b/00170-gc-assertions.patch @@ -1,16 +1,18 @@ -diff -up Python-2.7.3/Lib/test/test_gc.py.gc-assertions Python-2.7.3/Lib/test/test_gc.py ---- Python-2.7.3/Lib/test/test_gc.py.gc-assertions 2013-02-20 16:28:20.890536607 -0500 -+++ Python-2.7.3/Lib/test/test_gc.py 2013-02-20 16:39:52.720489297 -0500 -@@ -1,6 +1,7 @@ +diff --git a/Lib/test/test_gc.py b/Lib/test/test_gc.py +index 7e47b2d..12a210d 100644 +--- a/Lib/test/test_gc.py ++++ b/Lib/test/test_gc.py +@@ -1,7 +1,8 @@ import unittest --from test.test_support import verbose, run_unittest, start_threads -+from test.test_support import verbose, run_unittest, start_threads, import_module + from test.support import (verbose, run_unittest, start_threads, +- requires_type_collecting) ++ requires_type_collecting, import_module) import sys +import sysconfig import time import gc import weakref -@@ -32,6 +33,8 @@ class GC_Detector(object): +@@ -39,6 +40,8 @@ class GC_Detector(object): self.wr = weakref.ref(C1055820(666), it_happened) @@ -19,7 +21,7 @@ diff -up Python-2.7.3/Lib/test/test_gc.py.gc-assertions Python-2.7.3/Lib/test/te ### Tests ############################################################################### -@@ -476,6 +479,49 @@ class GCTests(unittest.TestCase): +@@ -537,6 +540,49 @@ class GCTests(unittest.TestCase): # would be damaged, with an empty __dict__. self.assertEqual(x, None) @@ -69,9 +71,10 @@ diff -up Python-2.7.3/Lib/test/test_gc.py.gc-assertions Python-2.7.3/Lib/test/te class GCTogglingTests(unittest.TestCase): def setUp(self): gc.enable() -diff -up Python-2.7.3/Modules/gcmodule.c.gc-assertions Python-2.7.3/Modules/gcmodule.c ---- Python-2.7.3/Modules/gcmodule.c.gc-assertions 2012-04-09 19:07:34.000000000 -0400 -+++ Python-2.7.3/Modules/gcmodule.c 2013-02-20 16:28:21.029536600 -0500 +diff --git a/Modules/gcmodule.c b/Modules/gcmodule.c +index 916e481..0233ce2 100644 +--- a/Modules/gcmodule.c ++++ b/Modules/gcmodule.c @@ -21,6 +21,73 @@ #include "Python.h" #include "frameobject.h" /* for PyFrame_ClearFreeList */ @@ -146,7 +149,7 @@ diff -up Python-2.7.3/Modules/gcmodule.c.gc-assertions Python-2.7.3/Modules/gcmo /* Get an object's GC head */ #define AS_GC(o) ((PyGC_Head *)(o)-1) -@@ -288,7 +355,8 @@ update_refs(PyGC_Head *containers) +@@ -328,7 +395,8 @@ update_refs(PyGC_Head *containers) { PyGC_Head *gc = containers->gc.gc_next; for (; gc != containers; gc = gc->gc.gc_next) { @@ -156,7 +159,7 @@ diff -up Python-2.7.3/Modules/gcmodule.c.gc-assertions Python-2.7.3/Modules/gcmo gc->gc.gc_refs = Py_REFCNT(FROM_GC(gc)); /* Python's cyclic gc should never see an incoming refcount * of 0: if something decref'ed to 0, it should have been -@@ -308,7 +376,8 @@ update_refs(PyGC_Head *containers) +@@ -348,7 +416,8 @@ update_refs(PyGC_Head *containers) * so serious that maybe this should be a release-build * check instead of an assert? */ @@ -166,7 +169,7 @@ diff -up Python-2.7.3/Modules/gcmodule.c.gc-assertions Python-2.7.3/Modules/gcmo } } -@@ -323,7 +392,9 @@ visit_decref(PyObject *op, void *data) +@@ -363,7 +432,9 @@ visit_decref(PyObject *op, void *data) * generation being collected, which can be recognized * because only they have positive gc_refs. */ @@ -177,7 +180,7 @@ diff -up Python-2.7.3/Modules/gcmodule.c.gc-assertions Python-2.7.3/Modules/gcmo if (gc->gc.gc_refs > 0) gc->gc.gc_refs--; } -@@ -383,9 +454,10 @@ visit_reachable(PyObject *op, PyGC_Head +@@ -423,9 +494,10 @@ visit_reachable(PyObject *op, PyGC_Head *reachable) * If gc_refs == GC_UNTRACKED, it must be ignored. */ else { @@ -191,7 +194,7 @@ diff -up Python-2.7.3/Modules/gcmodule.c.gc-assertions Python-2.7.3/Modules/gcmo } } return 0; -@@ -427,7 +499,7 @@ move_unreachable(PyGC_Head *young, PyGC_ +@@ -467,7 +539,7 @@ move_unreachable(PyGC_Head *young, PyGC_Head *unreachable) */ PyObject *op = FROM_GC(gc); traverseproc traverse = Py_TYPE(op)->tp_traverse; @@ -200,7 +203,7 @@ diff -up Python-2.7.3/Modules/gcmodule.c.gc-assertions Python-2.7.3/Modules/gcmo gc->gc.gc_refs = GC_REACHABLE; (void) traverse(op, (visitproc)visit_reachable, -@@ -494,7 +566,8 @@ move_finalizers(PyGC_Head *unreachable, +@@ -545,7 +617,8 @@ move_finalizers(PyGC_Head *unreachable, PyGC_Head *finalizers) for (gc = unreachable->gc.gc_next; gc != unreachable; gc = next) { PyObject *op = FROM_GC(gc); @@ -210,7 +213,7 @@ diff -up Python-2.7.3/Modules/gcmodule.c.gc-assertions Python-2.7.3/Modules/gcmo next = gc->gc.gc_next; if (has_finalizer(op)) { -@@ -570,7 +643,7 @@ handle_weakrefs(PyGC_Head *unreachable, +@@ -621,7 +694,7 @@ handle_weakrefs(PyGC_Head *unreachable, PyGC_Head *old) PyWeakReference **wrlist; op = FROM_GC(gc); @@ -219,7 +222,7 @@ diff -up Python-2.7.3/Modules/gcmodule.c.gc-assertions Python-2.7.3/Modules/gcmo next = gc->gc.gc_next; if (! PyType_SUPPORTS_WEAKREFS(Py_TYPE(op))) -@@ -591,9 +664,9 @@ handle_weakrefs(PyGC_Head *unreachable, +@@ -642,9 +715,9 @@ handle_weakrefs(PyGC_Head *unreachable, PyGC_Head *old) * the callback pointer intact. Obscure: it also * changes *wrlist. */ @@ -231,7 +234,7 @@ diff -up Python-2.7.3/Modules/gcmodule.c.gc-assertions Python-2.7.3/Modules/gcmo if (wr->wr_callback == NULL) continue; /* no callback */ -@@ -627,7 +700,7 @@ handle_weakrefs(PyGC_Head *unreachable, +@@ -678,7 +751,7 @@ handle_weakrefs(PyGC_Head *unreachable, PyGC_Head *old) */ if (IS_TENTATIVELY_UNREACHABLE(wr)) continue; @@ -240,7 +243,7 @@ diff -up Python-2.7.3/Modules/gcmodule.c.gc-assertions Python-2.7.3/Modules/gcmo /* Create a new reference so that wr can't go away * before we can process it again. -@@ -636,7 +709,8 @@ handle_weakrefs(PyGC_Head *unreachable, +@@ -687,7 +760,8 @@ handle_weakrefs(PyGC_Head *unreachable, PyGC_Head *old) /* Move wr to wrcb_to_call, for the next pass. */ wrasgc = AS_GC(wr); @@ -250,7 +253,7 @@ diff -up Python-2.7.3/Modules/gcmodule.c.gc-assertions Python-2.7.3/Modules/gcmo next isn't, so they can't be the same */ gc_list_move(wrasgc, &wrcb_to_call); -@@ -652,11 +726,11 @@ handle_weakrefs(PyGC_Head *unreachable, +@@ -703,11 +777,11 @@ handle_weakrefs(PyGC_Head *unreachable, PyGC_Head *old) gc = wrcb_to_call.gc.gc_next; op = FROM_GC(gc); @@ -265,7 +268,7 @@ diff -up Python-2.7.3/Modules/gcmodule.c.gc-assertions Python-2.7.3/Modules/gcmo /* copy-paste of weakrefobject.c's handle_callback() */ temp = PyObject_CallFunctionObjArgs(callback, wr, NULL); -@@ -759,7 +833,7 @@ delete_garbage(PyGC_Head *collectable, P +@@ -810,7 +884,7 @@ delete_garbage(PyGC_Head *collectable, PyGC_Head *old) PyGC_Head *gc = collectable->gc.gc_next; PyObject *op = FROM_GC(gc); diff --git a/00198-add-rewheel-module.patch b/00198-add-rewheel-module.patch index 029f24f..0273f1b 100644 --- a/00198-add-rewheel-module.patch +++ b/00198-add-rewheel-module.patch @@ -1,5 +1,5 @@ diff --git a/Lib/ensurepip/__init__.py b/Lib/ensurepip/__init__.py -index 14c9adb..e20104e 100644 +index 89ed1ef..e2a4c25 100644 --- a/Lib/ensurepip/__init__.py +++ b/Lib/ensurepip/__init__.py @@ -7,6 +7,7 @@ import pkgutil @@ -7,22 +7,22 @@ index 14c9adb..e20104e 100644 import sys import tempfile +from ensurepip import rewheel - - + + __all__ = ["version", "bootstrap"] -@@ -43,6 +44,8 @@ def _run_pip(args, additional_paths=None): - +@@ -29,6 +30,8 @@ def _run_pip(args, additional_paths=None): + # Install the bundled software import pip + if args[0] in ["install", "list", "wheel"]: + args.append('--pre') - pip.main(args) - - -@@ -93,21 +96,40 @@ def bootstrap(root=None, upgrade=False, user=False, + return pip.main(args) + + +@@ -93,21 +96,40 @@ def _bootstrap(root=None, upgrade=False, user=False, # omit pip and easy_install os.environ["ENSUREPIP_OPTIONS"] = "install" - + + whls = [] + rewheel_dir = None + # try to see if we have system-wide versions of _PROJECTS @@ -67,7 +67,7 @@ index 14c9adb..e20104e 100644 + additional_paths.append(os.path.join(tmpdir, os.path.basename(whl))) + if rewheel_dir: + shutil.rmtree(rewheel_dir) - + # Construct the arguments to be passed to the pip command args = ["install", "--no-index", "--find-links", tmpdir] diff --git a/Lib/ensurepip/rewheel/__init__.py b/Lib/ensurepip/rewheel/__init__.py @@ -235,15 +235,15 @@ index 0000000..75c2094 + pass # bad RECORD or empty line + return to_write, to_omit diff --git a/Makefile.pre.in b/Makefile.pre.in -index ca33158..44bdde5 100644 +index 877698c..2c43611 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in -@@ -1066,7 +1066,7 @@ LIBSUBDIRS= lib-tk lib-tk/test lib-tk/test/test_tkinter \ - test/tracedmodules \ - encodings compiler hotshot \ - email email/mime email/test email/test/data \ +@@ -1065,7 +1065,7 @@ LIBSUBDIRS= lib-tk lib-tk/test lib-tk/test/test_tkinter \ + test/tracedmodules \ + encodings compiler hotshot \ + email email/mime email/test email/test/data \ - ensurepip ensurepip/_bundled \ + ensurepip ensurepip/_bundled ensurepip/rewheel\ - json json/tests \ - sqlite3 sqlite3/test \ - logging bsddb bsddb/test csv importlib wsgiref \ + json json/tests \ + sqlite3 sqlite3/test \ + logging bsddb bsddb/test csv importlib wsgiref \ diff --git a/00280-Fix-test_regrtest-test_crashed-on-s390x.patch b/00280-Fix-test_regrtest-test_crashed-on-s390x.patch deleted file mode 100644 index 4a340c8..0000000 --- a/00280-Fix-test_regrtest-test_crashed-on-s390x.patch +++ /dev/null @@ -1,88 +0,0 @@ -From ab35adc682ec51800aa19a77de9947c6aaa50f41 Mon Sep 17 00:00:00 2001 -From: Victor Stinner -Date: Fri, 6 Oct 2017 22:28:59 +0200 -Subject: [PATCH] bpo-31719: Fix test_regrtest.test_crashed() on s390x - -Add a new _testcapi._read_null() function to crash Python in a -reliable way on s390x. - -On s390x, ctypes.string_at(0) returns an empty string rather than -crashing. ---- - Lib/test/support/__init__.py | 4 ++-- - Lib/test/test_regrtest.py | 2 ++ - .../next/Tests/2017-10-06-22-37-38.bpo-31719.gHyrV3.rst | 3 +++ - Modules/_testcapimodule.c | 17 +++++++++++++++++ - 4 files changed, 24 insertions(+), 2 deletions(-) - create mode 100644 Misc/NEWS.d/next/Tests/2017-10-06-22-37-38.bpo-31719.gHyrV3.rst - -diff --git a/Lib/test/support/__init__.py b/Lib/test/support/__init__.py -index ef474e00b68..25df3ed0c41 100644 ---- a/Lib/test/support/__init__.py -+++ b/Lib/test/support/__init__.py -@@ -1960,6 +1960,6 @@ def _crash_python(): - Use SuppressCrashReport() to prevent a crash report from popping up. - """ - -- import ctypes -+ import _testcapi - with SuppressCrashReport(): -- ctypes.string_at(0) -+ _testcapi._read_null() -diff --git a/Lib/test/test_regrtest.py b/Lib/test/test_regrtest.py -index 264c74d22ba..aae274384c7 100644 ---- a/Lib/test/test_regrtest.py -+++ b/Lib/test/test_regrtest.py -@@ -543,6 +543,8 @@ def test_method2(self): - testname) - self.assertEqual(output.splitlines(), all_methods) - -+ @unittest.skipIf(sys.platform.startswith('aix'), -+ "support._crash_python() doesn't work on AIX") - def test_crashed(self): - # Any code which causes a crash - code = 'import test.support; test.support._crash_python()' -diff --git a/Misc/NEWS.d/next/Tests/2017-10-06-22-37-38.bpo-31719.gHyrV3.rst b/Misc/NEWS.d/next/Tests/2017-10-06-22-37-38.bpo-31719.gHyrV3.rst -new file mode 100644 -index 00000000000..a06c5267251 ---- /dev/null -+++ b/Misc/NEWS.d/next/Tests/2017-10-06-22-37-38.bpo-31719.gHyrV3.rst -@@ -0,0 +1,3 @@ -+Fix test_regrtest.test_crashed() on s390x. Add a new _testcapi._read_null() -+function to crash Python in a reliable way on s390x. On s390x, -+ctypes.string_at(0) returns an empty string rather than crashing. -diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c -index 7691b5188ff..5902de07823 100644 ---- a/Modules/_testcapimodule.c -+++ b/Modules/_testcapimodule.c -@@ -2566,6 +2566,22 @@ py_w_stopcode(PyObject *self, PyObject *args) - #endif - - -+/* Read memory from NULL (address 0) to raise a SIGSEGV or SIGBUS signal -+ depending on the platform. This function is used by -+ test.support._crash_python() to "crash" Python. */ -+static PyObject * -+read_null(PyObject *self, PyObject *args) -+{ -+ volatile int *x; -+ volatile int y; -+ -+ x = NULL; -+ y = *x; -+ return PyLong_FromLong(y); -+ -+} -+ -+ - static PyMethodDef TestMethods[] = { - {"raise_exception", raise_exception, METH_VARARGS}, - {"set_errno", set_errno, METH_VARARGS}, -@@ -2685,6 +2701,7 @@ static PyMethodDef TestMethods[] = { - #ifdef W_STOPCODE - {"W_STOPCODE", py_w_stopcode, METH_VARARGS}, - #endif -+ {"_read_null", (PyCFunction)read_null, METH_NOARGS}, - {NULL, NULL} /* sentinel */ - }; - diff --git a/00283-fix-tests_with_COUNT_ALLOCS.patch b/00283-fix-tests_with_COUNT_ALLOCS.patch deleted file mode 100644 index 358d473..0000000 --- a/00283-fix-tests_with_COUNT_ALLOCS.patch +++ /dev/null @@ -1,184 +0,0 @@ -From 7b4ba62e388474e811268322b47f80d464933541 Mon Sep 17 00:00:00 2001 -From: Victor Stinner -Date: Tue, 17 Oct 2017 02:25:23 -0700 -Subject: [PATCH] [2.7] bpo-31692: Add PYTHONSHOWALLOCCOUNT env var (GH-3927) - -bpo-31692, bpo-19527: - -* Add a new PYTHONSHOWALLOCCOUNT environment variable, similar to - the Python 3 "-X showalloccount" option -* When Python is compiled with COUNT_ALLOCS, the new - PYTHONSHOWALLOCCOUNT environment variable now has to be set to dump - allocation counts into stderr on shutdown. Moreover, allocations - statistics are now dumped into stderr rather than stdout. -* Add @test.support.requires_type_collecting decorator: skip test if - COUNT_ALLOCS is defined -* Fix tests for COUNT_ALLOCS: decorate some methods with - @requires_type_collecting -* test_sys.test_objecttypes(): update object type when COUNT_ALLOCS - is defined ---- - Doc/c-api/typeobj.rst | 2 +- - Doc/using/cmdline.rst | 7 +++++++ - Lib/test/support/__init__.py | 3 +++ - Lib/test/test_abc.py | 1 + - Lib/test/test_gc.py | 4 +++- - Lib/test/test_regrtest.py | 1 + - Lib/test/test_sys.py | 5 ++++- - Lib/test/test_weakref.py | 1 + - .../Core and Builtins/2017-10-09-11-03-13.bpo-31692.5-bpdk.rst | 4 ++++ - Python/pythonrun.c | 4 +++- - 10 files changed, 28 insertions(+), 4 deletions(-) - create mode 100644 Misc/NEWS.d/next/Core and Builtins/2017-10-09-11-03-13.bpo-31692.5-bpdk.rst - -diff --git a/Doc/c-api/typeobj.rst b/Doc/c-api/typeobj.rst -index 18edcdd7e5a..f0ccf2ea5fe 100644 ---- a/Doc/c-api/typeobj.rst -+++ b/Doc/c-api/typeobj.rst -@@ -1101,7 +1101,7 @@ The next fields, up to and including :c:member:`~PyTypeObject.tp_weaklist`, only - The remaining fields are only defined if the feature test macro - :const:`COUNT_ALLOCS` is defined, and are for internal use only. They are - documented here for completeness. None of these fields are inherited by --subtypes. -+subtypes. See the :envvar:`PYTHONSHOWALLOCCOUNT` environment variable. - - - .. c:member:: Py_ssize_t PyTypeObject.tp_allocs -diff --git a/Doc/using/cmdline.rst b/Doc/using/cmdline.rst -index f00f7f6026a..55bc12893d6 100644 ---- a/Doc/using/cmdline.rst -+++ b/Doc/using/cmdline.rst -@@ -663,3 +663,10 @@ if Python was configured with the ``--with-pydebug`` build option. - - If set, Python will print memory allocation statistics every time a new - object arena is created, and on shutdown. -+ -+.. envvar:: PYTHONSHOWALLOCCOUNT -+ -+ If set and Python was compiled with ``COUNT_ALLOCS`` defined, Python will -+ dump allocations counts into stderr on shutdown. -+ -+ .. versionadded:: 2.7.15 -diff --git a/Doc/whatsnew/2.7.rst b/Doc/whatsnew/2.7.rst -index 28a8d4b..f0d2428 100644 ---- a/Doc/whatsnew/2.7.rst -+++ b/Doc/whatsnew/2.7.rst -@@ -2540,6 +2540,17 @@ exemption allowing new ``-3`` warnings to be added in any Python 2.7 - maintenance release. - - -+Two new environment variables for debug mode -+-------------------------------------------- -+ -+When Python is compiled with ``COUNT_ALLOC`` defined, allocation counts are no -+longer dumped by default anymore: the :envvar:`PYTHONSHOWALLOCCOUNT` environment -+variable must now also be set. Moreover, allocation counts are now dumped into -+stderr, rather than stdout. (Contributed by Victor Stinner; :issue:`31692`.) -+ -+.. versionadded:: 2.7.15 -+ -+ - PEP 434: IDLE Enhancement Exception for All Branches - ---------------------------------------------------- - -diff --git a/Lib/test/support/__init__.py b/Lib/test/support/__init__.py -index 25df3ed0c41..d14a6620b5d 100644 ---- a/Lib/test/support/__init__.py -+++ b/Lib/test/support/__init__.py -@@ -1795,6 +1795,9 @@ def py3k_bytes(b): - except TypeError: - return bytes(b) - -+requires_type_collecting = unittest.skipIf(hasattr(sys, 'getcounts'), -+ 'types are immortal if COUNT_ALLOCS is defined') -+ - def args_from_interpreter_flags(): - """Return a list of command-line arguments reproducing the current - settings in sys.flags.""" -diff --git a/Lib/test/test_abc.py b/Lib/test/test_abc.py -index 6a8c3a13274..dbba37cdb6f 100644 ---- a/Lib/test/test_abc.py -+++ b/Lib/test/test_abc.py -@@ -208,6 +208,7 @@ class C(A, B): - C() - self.assertEqual(B.counter, 1) - -+ @test_support.requires_type_collecting - def test_cache_leak(self): - # See issue #2521. - class A(object): -diff --git a/Lib/test/test_gc.py b/Lib/test/test_gc.py -index ed01c9802fc..7e47b2d3a27 100644 ---- a/Lib/test/test_gc.py -+++ b/Lib/test/test_gc.py -@@ -1,5 +1,6 @@ - import unittest --from test.test_support import verbose, run_unittest, start_threads, import_module -+from test.support import (verbose, run_unittest, start_threads, import_module, -+ requires_type_collecting) - import sys - import sysconfig - import time -@@ -90,6 +91,7 @@ class A: - del a - self.assertNotEqual(gc.collect(), 0) - -+ @requires_type_collecting - def test_newinstance(self): - class A(object): - pass -diff --git a/Lib/test/test_regrtest.py b/Lib/test/test_regrtest.py -index aae274384c7..988a72c1099 100644 ---- a/Lib/test/test_regrtest.py -+++ b/Lib/test/test_regrtest.py -@@ -493,6 +493,7 @@ def check_leak(self, code, what): - self.assertIn(line2, reflog) - - @unittest.skipUnless(Py_DEBUG, 'need a debug build') -+ @support.requires_type_collecting - def test_huntrleaks(self): - # test --huntrleaks - code = textwrap.dedent(""" -diff --git a/Lib/test/test_sys.py b/Lib/test/test_sys.py -index 5baaa352c0b..9342716272a 100644 ---- a/Lib/test/test_sys.py -+++ b/Lib/test/test_sys.py -@@ -748,7 +748,10 @@ def delx(self): del self.__x - # tupleiterator - check(iter(()), size('lP')) - # type -- s = vsize('P2P15Pl4PP9PP11PI' # PyTypeObject -+ fmt = 'P2P15Pl4PP9PP11PI' -+ if hasattr(sys, 'getcounts'): -+ fmt += '3P2P' -+ s = vsize(fmt + # PyTypeObject - '39P' # PyNumberMethods - '3P' # PyMappingMethods - '10P' # PySequenceMethods -diff --git a/Lib/test/test_weakref.py b/Lib/test/test_weakref.py -index 415d5ebbd72..418481dadd8 100644 ---- a/Lib/test/test_weakref.py -+++ b/Lib/test/test_weakref.py -@@ -601,6 +601,7 @@ class D: - del c1, c2, C, D - gc.collect() - -+ @test_support.requires_type_collecting - def test_callback_in_cycle_resurrection(self): - import gc - -diff --git a/Python/pythonrun.c b/Python/pythonrun.c -index 677f6e48111..44fe13d2f7d 100644 ---- a/Python/pythonrun.c -+++ b/Python/pythonrun.c -@@ -488,7 +488,9 @@ Py_Finalize(void) - - /* Debugging stuff */ - #ifdef COUNT_ALLOCS -- dump_counts(stdout); -+ if (Py_GETENV("PYTHONSHOWALLOCCOUNT")) { -+ dump_counts(stderr); -+ } - #endif - - PRINT_TOTAL_REFS(); diff --git a/00284-add-PYTHONSHOWREFCOUNT-env-var.patch b/00284-add-PYTHONSHOWREFCOUNT-env-var.patch deleted file mode 100644 index bfa71dc..0000000 --- a/00284-add-PYTHONSHOWREFCOUNT-env-var.patch +++ /dev/null @@ -1,92 +0,0 @@ -diff --git a/Doc/using/cmdline.rst b/Doc/using/cmdline.rst -index 55bc128..15d5830 100644 ---- a/Doc/using/cmdline.rst -+++ b/Doc/using/cmdline.rst -@@ -664,6 +664,13 @@ if Python was configured with the ``--with-pydebug`` build option. - If set, Python will print memory allocation statistics every time a new - object arena is created, and on shutdown. - -+.. envvar:: PYTHONSHOWREFCOUNT -+ -+ If set, Python will print the total reference count when the program -+ finishes or after each statement in the interactive interpreter. -+ -+ .. versionadded:: 2.7.15 -+ - .. envvar:: PYTHONSHOWALLOCCOUNT - - If set and Python was compiled with ``COUNT_ALLOCS`` defined, Python will -diff --git a/Doc/whatsnew/2.7.rst b/Doc/whatsnew/2.7.rst -index f0d2428..b29593a 100644 ---- a/Doc/whatsnew/2.7.rst -+++ b/Doc/whatsnew/2.7.rst -@@ -2548,6 +2548,10 @@ longer dumped by default anymore: the :envvar:`PYTHONSHOWALLOCCOUNT` environment - variable must now also be set. Moreover, allocation counts are now dumped into - stderr, rather than stdout. (Contributed by Victor Stinner; :issue:`31692`.) - -+In debug mode, the ``[xxx refs]`` statistic is not written by default, the -+:envvar:`PYTHONSHOWREFCOUNT` environment variable now must also be set. -+(Contributed by Victor Stinner; :issue:`31733`.) -+ - .. versionadded:: 2.7.15 - - -diff --git a/Python/pythonrun.c b/Python/pythonrun.c -index d17f7f3..eb31e34 100644 ---- a/Python/pythonrun.c -+++ b/Python/pythonrun.c -@@ -37,14 +37,6 @@ - #include "windows.h" - #endif - --#ifndef Py_REF_DEBUG --#define PRINT_TOTAL_REFS() --#else /* Py_REF_DEBUG */ --#define PRINT_TOTAL_REFS() fprintf(stderr, \ -- "[%" PY_FORMAT_SIZE_T "d refs]\n", \ -- _Py_GetRefTotal()) --#endif -- - #ifdef __cplusplus - extern "C" { - #endif -@@ -104,6 +96,21 @@ PyModule_GetWarningsModule(void) - return PyImport_ImportModule("warnings"); - } - -+static void -+_PyDebug_PrintTotalRefs(void) -+{ -+#ifdef Py_REF_DEBUG -+ Py_ssize_t total; -+ -+ if (!Py_GETENV("PYTHONSHOWREFCOUNT")) { -+ return; -+ } -+ -+ total = _Py_GetRefTotal(); -+ fprintf(stderr, "[%" PY_FORMAT_SIZE_T "d refs]\n", total); -+#endif -+} -+ - static int initialized = 0; - - /* API to access the initialized flag -- useful for esoteric use */ -@@ -486,7 +493,7 @@ Py_Finalize(void) - } - #endif - -- PRINT_TOTAL_REFS(); -+ _PyDebug_PrintTotalRefs(); - - #ifdef Py_TRACE_REFS - /* Display all objects still alive -- this can invoke arbitrary -@@ -777,7 +784,7 @@ PyRun_InteractiveLoopFlags(FILE *fp, const char *filename, PyCompilerFlags *flag - } - for (;;) { - ret = PyRun_InteractiveOneFlags(fp, filename, flags); -- PRINT_TOTAL_REFS(); -+ _PyDebug_PrintTotalRefs(); - if (ret == E_EOF) - return 0; - /* diff --git a/00285-fix-non-deterministic-read-in-test_pty.patch b/00285-fix-non-deterministic-read-in-test_pty.patch deleted file mode 100644 index 8605809..0000000 --- a/00285-fix-non-deterministic-read-in-test_pty.patch +++ /dev/null @@ -1,59 +0,0 @@ -diff --git a/Lib/test/test_pty.py b/Lib/test/test_pty.py -index bec38c45456..f623aa09620 100644 ---- a/Lib/test/test_pty.py -+++ b/Lib/test/test_pty.py -@@ -11,6 +11,7 @@ - import select - import signal - import socket -+import io # readline - import unittest - - TEST_STRING_1 = "I wish to buy a fish license.\n" -@@ -24,6 +25,16 @@ def debug(msg): - pass - - -+# Note that os.read() is nondeterministic so we need to be very careful -+# to make the test suite deterministic. A normal call to os.read() may -+# give us less than expected. -+# -+# Beware, on my Linux system, if I put 'foo\n' into a terminal fd, I get -+# back 'foo\r\n' at the other end. The behavior depends on the termios -+# setting. The newline translation may be OS-specific. To make the -+# test suite deterministic and OS-independent, the functions _readline -+# and normalize_output can be used. -+ - def normalize_output(data): - # Some operating systems do conversions on newline. We could possibly - # fix that by doing the appropriate termios.tcsetattr()s. I couldn't -@@ -45,6 +56,12 @@ def normalize_output(data): - - return data - -+def _readline(fd): -+ """Read one line. May block forever if no newline is read.""" -+ reader = io.FileIO(fd, mode='rb', closefd=False) -+ return reader.readline() -+ -+ - - # Marginal testing of pty suite. Cannot do extensive 'do or fail' testing - # because pty code is not too portable. -@@ -97,14 +114,14 @@ def test_basic(self): - - debug("Writing to slave_fd") - os.write(slave_fd, TEST_STRING_1) -- s1 = os.read(master_fd, 1024) -+ s1 = _readline(master_fd) - self.assertEqual('I wish to buy a fish license.\n', - normalize_output(s1)) - - debug("Writing chunked output") - os.write(slave_fd, TEST_STRING_2[:5]) - os.write(slave_fd, TEST_STRING_2[5:]) -- s2 = os.read(master_fd, 1024) -+ s2 = _readline(master_fd) - self.assertEqual('For my pet fish, Eric.\n', normalize_output(s2)) - - os.close(slave_fd) diff --git a/00287-fix-thread-hanging-on-inaccessible-nfs-server.patch b/00287-fix-thread-hanging-on-inaccessible-nfs-server.patch deleted file mode 100644 index 1dbb62f..0000000 --- a/00287-fix-thread-hanging-on-inaccessible-nfs-server.patch +++ /dev/null @@ -1,135 +0,0 @@ -diff --git a/Modules/_io/fileio.c b/Modules/_io/fileio.c -index 4a71a57ec0d..2b40ada195a 100644 ---- a/Modules/_io/fileio.c -+++ b/Modules/_io/fileio.c -@@ -146,9 +146,15 @@ dircheck(fileio* self, PyObject *nameobj) - { - #if defined(HAVE_FSTAT) && defined(S_IFDIR) && defined(EISDIR) - struct stat buf; -+ int res; - if (self->fd < 0) - return 0; -- if (fstat(self->fd, &buf) == 0 && S_ISDIR(buf.st_mode)) { -+ -+ Py_BEGIN_ALLOW_THREADS -+ res = fstat(self->fd, &buf); -+ Py_END_ALLOW_THREADS -+ -+ if (res == 0 && S_ISDIR(buf.st_mode)) { - errno = EISDIR; - PyErr_SetFromErrnoWithFilenameObject(PyExc_IOError, nameobj); - return -1; -@@ -162,17 +168,34 @@ check_fd(int fd) - { - #if defined(HAVE_FSTAT) - struct stat buf; -- if (!_PyVerify_fd(fd) || (fstat(fd, &buf) < 0 && errno == EBADF)) { -- PyObject *exc; -- char *msg = strerror(EBADF); -- exc = PyObject_CallFunction(PyExc_OSError, "(is)", -- EBADF, msg); -- PyErr_SetObject(PyExc_OSError, exc); -- Py_XDECREF(exc); -- return -1; -+ int res; -+ PyObject *exc; -+ char *msg; -+ -+ if (!_PyVerify_fd(fd)) { -+ goto badfd; - } --#endif -+ -+ Py_BEGIN_ALLOW_THREADS -+ res = fstat(fd, &buf); -+ Py_END_ALLOW_THREADS -+ -+ if (res < 0 && errno == EBADF) { -+ goto badfd; -+ } -+ - return 0; -+ -+badfd: -+ msg = strerror(EBADF); -+ exc = PyObject_CallFunction(PyExc_OSError, "(is)", -+ EBADF, msg); -+ PyErr_SetObject(PyExc_OSError, exc); -+ Py_XDECREF(exc); -+ return -1; -+#else -+ return 0; -+#endif - } - - -@@ -519,9 +542,19 @@ new_buffersize(fileio *self, size_t currentsize) - #ifdef HAVE_FSTAT - off_t pos, end; - struct stat st; -- if (fstat(self->fd, &st) == 0) { -+ int res; -+ -+ Py_BEGIN_ALLOW_THREADS -+ res = fstat(self->fd, &st); -+ Py_END_ALLOW_THREADS -+ -+ if (res == 0) { - end = st.st_size; -+ -+ Py_BEGIN_ALLOW_THREADS - pos = lseek(self->fd, 0L, SEEK_CUR); -+ Py_END_ALLOW_THREADS -+ - /* Files claiming a size smaller than SMALLCHUNK may - actually be streaming pseudo-files. In this case, we - apply the more aggressive algorithm below. -diff --git a/Objects/fileobject.c b/Objects/fileobject.c -index 2f63c374d1e..8d1c5812f0d 100644 ---- a/Objects/fileobject.c -+++ b/Objects/fileobject.c -@@ -121,10 +121,15 @@ dircheck(PyFileObject* f) - { - #if defined(HAVE_FSTAT) && defined(S_IFDIR) && defined(EISDIR) - struct stat buf; -+ int res; - if (f->f_fp == NULL) - return f; -- if (fstat(fileno(f->f_fp), &buf) == 0 && -- S_ISDIR(buf.st_mode)) { -+ -+ Py_BEGIN_ALLOW_THREADS -+ res = fstat(fileno(f->f_fp), &buf); -+ Py_END_ALLOW_THREADS -+ -+ if (res == 0 && S_ISDIR(buf.st_mode)) { - char *msg = strerror(EISDIR); - PyObject *exc = PyObject_CallFunction(PyExc_IOError, "(isO)", - EISDIR, msg, f->f_name); -@@ -1010,7 +1015,13 @@ new_buffersize(PyFileObject *f, size_t currentsize) - #ifdef HAVE_FSTAT - off_t pos, end; - struct stat st; -- if (fstat(fileno(f->f_fp), &st) == 0) { -+ int res; -+ -+ Py_BEGIN_ALLOW_THREADS -+ res = fstat(fileno(f->f_fp), &st); -+ Py_END_ALLOW_THREADS -+ -+ if (res == 0) { - end = st.st_size; - /* The following is not a bug: we really need to call lseek() - *and* ftell(). The reason is that some stdio libraries -@@ -1021,7 +1032,11 @@ new_buffersize(PyFileObject *f, size_t currentsize) - works. We can't use the lseek() value either, because we - need to take the amount of buffered data into account. - (Yet another reason why stdio stinks. :-) */ -+ -+ Py_BEGIN_ALLOW_THREADS - pos = lseek(fileno(f->f_fp), 0L, SEEK_CUR); -+ Py_END_ALLOW_THREADS -+ - if (pos >= 0) { - pos = ftell(f->f_fp); - } diff --git a/00289-disable-nis-detection.patch b/00289-disable-nis-detection.patch index baf69b5..4e185bb 100644 --- a/00289-disable-nis-detection.patch +++ b/00289-disable-nis-detection.patch @@ -1,26 +1,69 @@ -diff a/setup.py b/setup.py ---- a/setup.py 2018-01-17 11:58:45.384354567 +0100 -+++ b/setup.py 2018-01-17 11:54:23.384743168 +0100 -@@ -1346,19 +1346,10 @@ +diff --git a/setup.py b/setup.py +index 585e380..9993f11 100644 +--- a/setup.py ++++ b/setup.py +@@ -1346,11 +1346,7 @@ class PyBuildExt(build_ext): else: missing.append('resource') -- # Sun yellow pages. Some systems have the functions in libc. -- if (host_platform not in ['cygwin', 'atheos', 'qnx6'] and -- find_file('rpcsvc/yp_prot.h', inc_dirs, []) is not None): -- if (self.compiler.find_library_file(lib_dirs, 'nsl')): -- libs = ['nsl'] -- else: -- libs = [] -- exts.append( Extension('nis', ['nismodule.c'], -- libraries = libs) ) +- nis = self._detect_nis(inc_dirs, lib_dirs) +- if nis is not None: +- exts.append(nis) - else: - missing.append('nis') + # nis (Sun yellow pages) is handled in Setup.dist -+ - else: -- missing.extend(['nis', 'resource', 'termios']) -+ missing.extend(['resource', 'termios']) # Curses support, requiring the System V version of curses, often # provided by the ncurses library. +@@ -2162,51 +2158,6 @@ class PyBuildExt(build_ext): + # for dlopen, see bpo-32647 + ext.libraries.append('dl') + +- def _detect_nis(self, inc_dirs, lib_dirs): +- if host_platform in {'win32', 'cygwin', 'qnx6'}: +- return None +- +- libs = [] +- library_dirs = [] +- includes_dirs = [] +- +- # bpo-32521: glibc has deprecated Sun RPC for some time. Fedora 28 +- # moved headers and libraries to libtirpc and libnsl. The headers +- # are in tircp and nsl sub directories. +- rpcsvc_inc = find_file( +- 'rpcsvc/yp_prot.h', inc_dirs, +- [os.path.join(inc_dir, 'nsl') for inc_dir in inc_dirs] +- ) +- rpc_inc = find_file( +- 'rpc/rpc.h', inc_dirs, +- [os.path.join(inc_dir, 'tirpc') for inc_dir in inc_dirs] +- ) +- if rpcsvc_inc is None or rpc_inc is None: +- # not found +- return None +- includes_dirs.extend(rpcsvc_inc) +- includes_dirs.extend(rpc_inc) +- +- if self.compiler.find_library_file(lib_dirs, 'nsl'): +- libs.append('nsl') +- else: +- # libnsl-devel: check for libnsl in nsl/ subdirectory +- nsl_dirs = [os.path.join(lib_dir, 'nsl') for lib_dir in lib_dirs] +- libnsl = self.compiler.find_library_file(nsl_dirs, 'nsl') +- if libnsl is not None: +- library_dirs.append(os.path.dirname(libnsl)) +- libs.append('nsl') +- +- if self.compiler.find_library_file(lib_dirs, 'tirpc'): +- libs.append('tirpc') +- +- return Extension( +- 'nis', ['nismodule.c'], +- libraries=libs, +- library_dirs=library_dirs, +- include_dirs=includes_dirs +- ) +- + + class PyBuildInstall(install): + # Suppress the warning about installation into the lib_dynload diff --git a/00293-fix-gc-alignment.patch b/00293-fix-gc-alignment.patch deleted file mode 100644 index 691b03e..0000000 --- a/00293-fix-gc-alignment.patch +++ /dev/null @@ -1,39 +0,0 @@ -Fix for over-aligned GC info -Patch by Florian Weimer - -See: https://bugzilla.redhat.com/show_bug.cgi?id=1540316 -Upstream discussion: https://mail.python.org/pipermail/python-dev/2018-January/152000.html - -diff --git a/Include/objimpl.h b/Include/objimpl.h -index 55e83eced6..aa906144dc 100644 ---- a/Include/objimpl.h -+++ b/Include/objimpl.h -@@ -248,6 +248,18 @@ PyAPI_FUNC(PyVarObject *) _PyObject_GC_Resize(PyVarObject *, Py_ssize_t); - /* for source compatibility with 2.2 */ - #define _PyObject_GC_Del PyObject_GC_Del - -+/* Former over-aligned definition of PyGC_Head, used to compute the -+ size of the padding for the new version below. */ -+union _gc_head; -+union _gc_head_old { -+ struct { -+ union _gc_head *gc_next; -+ union _gc_head *gc_prev; -+ Py_ssize_t gc_refs; -+ } gc; -+ long double dummy; -+}; -+ - /* GC information is stored BEFORE the object structure. */ - typedef union _gc_head { - struct { -@@ -255,7 +267,8 @@ typedef union _gc_head { - union _gc_head *gc_prev; - Py_ssize_t gc_refs; - } gc; -- long double dummy; /* force worst-case alignment */ -+ double dummy; /* force worst-case alignment */ -+ char dummy_padding[sizeof(union _gc_head_old)]; - } PyGC_Head; - - extern PyGC_Head *_PyGC_generation0; diff --git a/00297-fix-int-in-bool-context-warnings.patch b/00297-fix-int-in-bool-context-warnings.patch deleted file mode 100644 index 4f29f37..0000000 --- a/00297-fix-int-in-bool-context-warnings.patch +++ /dev/null @@ -1,24 +0,0 @@ -commit fd39e2a6845f33a74fbb0671c434c0d84a5ec2f3 -Author: Christian Heimes -Date: Fri Sep 15 20:27:23 2017 +0200 - - bpo-31474: Fix -Wint-in-bool-context warnings (#3581) - - Signed-off-by: Christian Heimes - -diff --git a/Include/pymem.h b/Include/pymem.h -index 10b5bea5eb..2c239df590 100644 ---- a/Include/pymem.h -+++ b/Include/pymem.h -@@ -72,9 +72,9 @@ PyAPI_FUNC(void) PyMem_Free(void *); - /* Returns NULL to indicate error if a negative size or size larger than - Py_ssize_t can represent is supplied. Helps prevents security holes. */ - #define PyMem_MALLOC(n) ((size_t)(n) > (size_t)PY_SSIZE_T_MAX ? NULL \ -- : malloc((n) ? (n) : 1)) -+ : malloc(((n) != 0) ? (n) : 1)) - #define PyMem_REALLOC(p, n) ((size_t)(n) > (size_t)PY_SSIZE_T_MAX ? NULL \ -- : realloc((p), (n) ? (n) : 1)) -+ : realloc((p), ((n) != 0) ? (n) : 1)) - #define PyMem_FREE free - - #endif /* PYMALLOC_DEBUG */ diff --git a/00298-do-not-send-IP-in-SNI-TLS-extension.patch b/00298-do-not-send-IP-in-SNI-TLS-extension.patch deleted file mode 100644 index dc80f33..0000000 --- a/00298-do-not-send-IP-in-SNI-TLS-extension.patch +++ /dev/null @@ -1,68 +0,0 @@ -diff --git a/Misc/NEWS.d/next/Library/2017-12-20-09-25-10.bpo-32185.IL0cMt.rst b/Misc/NEWS.d/next/Library/2017-12-20-09-25-10.bpo-32185.IL0cMt.rst -new file mode 100644 -index 000000000000..bfb2533b5dcf ---- /dev/null -+++ b/Misc/NEWS.d/next/Library/2017-12-20-09-25-10.bpo-32185.IL0cMt.rst -@@ -0,0 +1,2 @@ -+The SSL module no longer sends IP addresses in SNI TLS extension on -+platforms with OpenSSL 1.0.2+ or inet_pton. -diff --git a/Modules/_ssl.c b/Modules/_ssl.c -index f70af266731a..b191b3a8687a 100644 ---- a/Modules/_ssl.c -+++ b/Modules/_ssl.c -@@ -52,6 +52,11 @@ - #include - #endif - -+#ifndef MS_WINDOWS -+/* inet_pton */ -+#include -+#endif -+ - /* Don't warn about deprecated functions */ - #ifdef __GNUC__ - #pragma GCC diagnostic ignored "-Wdeprecated-declarations" -@@ -575,8 +580,41 @@ newPySSLSocket(PySSLContext *sslctx, PySocketSockObject *sock, - SSL_set_mode(self->ssl, mode); - - #if HAVE_SNI -- if (server_hostname != NULL) -- SSL_set_tlsext_host_name(self->ssl, server_hostname); -+ if (server_hostname != NULL) { -+/* Don't send SNI for IP addresses. We cannot simply use inet_aton() and -+ * inet_pton() here. inet_aton() may be linked weakly and inet_pton() isn't -+ * available on all platforms. Use OpenSSL's IP address parser. It's -+ * available since 1.0.2 and LibreSSL since at least 2.3.0. */ -+ int send_sni = 1; -+#if OPENSSL_VERSION_NUMBER >= 0x10200000L -+ ASN1_OCTET_STRING *ip = a2i_IPADDRESS(server_hostname); -+ if (ip == NULL) { -+ send_sni = 1; -+ ERR_clear_error(); -+ } else { -+ send_sni = 0; -+ ASN1_OCTET_STRING_free(ip); -+ } -+#elif defined(HAVE_INET_PTON) -+#ifdef ENABLE_IPV6 -+ char packed[Py_MAX(sizeof(struct in_addr), sizeof(struct in6_addr))]; -+#else -+ char packed[sizeof(struct in_addr)]; -+#endif /* ENABLE_IPV6 */ -+ if (inet_pton(AF_INET, server_hostname, packed)) { -+ send_sni = 0; -+#ifdef ENABLE_IPV6 -+ } else if(inet_pton(AF_INET6, server_hostname, packed)) { -+ send_sni = 0; -+#endif /* ENABLE_IPV6 */ -+ } else { -+ send_sni = 1; -+ } -+#endif /* HAVE_INET_PTON */ -+ if (send_sni) { -+ SSL_set_tlsext_host_name(self->ssl, server_hostname); -+ } -+ } - #endif - - /* If the socket is in non-blocking mode or timeout mode, set the BIO diff --git a/00299-fix-ssl-module-pymax.patch b/00299-fix-ssl-module-pymax.patch deleted file mode 100644 index 4f8c8da..0000000 --- a/00299-fix-ssl-module-pymax.patch +++ /dev/null @@ -1,24 +0,0 @@ -From 439956a149f8a3eb44646498c63b2ef3337d5f3d Mon Sep 17 00:00:00 2001 -From: Christian Heimes -Date: Sun, 25 Feb 2018 13:08:05 +0100 -Subject: [PATCH] Fix ssl module, Python 2.7 doesn't have Py_MAX (#5878) - -Signed-off-by: Christian Heimes ---- - Modules/_ssl.c | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -diff --git a/Modules/_ssl.c b/Modules/_ssl.c -index af66a581e15a..f9ed94dee1e1 100644 ---- a/Modules/_ssl.c -+++ b/Modules/_ssl.c -@@ -610,7 +610,8 @@ newPySSLSocket(PySSLContext *sslctx, PySocketSockObject *sock, - } - #elif defined(HAVE_INET_PTON) - #ifdef ENABLE_IPV6 -- char packed[Py_MAX(sizeof(struct in_addr), sizeof(struct in6_addr))]; -+ #define PySSL_MAX(x, y) (((x) > (y)) ? (x) : (y)) -+ char packed[PySSL_MAX(sizeof(struct in_addr), sizeof(struct in6_addr))]; - #else - char packed[sizeof(struct in_addr)]; - #endif /* ENABLE_IPV6 */ diff --git a/python2.spec b/python2.spec index 8232b8b..10af069 100644 --- a/python2.spec +++ b/python2.spec @@ -103,8 +103,8 @@ Summary: An interpreted, interactive, object-oriented programming language Name: %{python} # Remember to also rebase python2-docs when changing this: -Version: 2.7.14 -Release: 17%{?dist} +Version: 2.7.15 +Release: 1%{?dist} License: Python Group: Development/Languages Requires: %{python}-libs%{?_isa} = %{version}-%{release} @@ -720,36 +720,6 @@ Patch193: 00193-enable-loading-sqlite-extensions.patch # 00198 # Patch198: 00198-add-rewheel-module.patch -# 00280 # -# The test `test_regrtest.test_crashed` fails on s390x architecture. -# https://bugs.python.org/issue31719 -Patch280: 00280-Fix-test_regrtest-test_crashed-on-s390x.patch - -# 00283 # -# Fix tests on debug build configured with COUNT_ALLOCS, -# and add a new environment variable PYTHONSHOWALLOCCOUNT: -# https://bugs.python.org/issue31692 -Patch283: 00283-fix-tests_with_COUNT_ALLOCS.patch - -# 00284 # -# Add a new PYTHONSHOWREFCOUNT environment variable. In debug mode, Python now -# will print the total reference count if PYTHONSHOWREFCOUNT is set. -# Backported from upstream: https://bugs.python.org/issue31733 -Patch284: 00284-add-PYTHONSHOWREFCOUNT-env-var.patch - -# 00285 # -# Fix nondeterministic read in test_pty which fails randomly in koji. -# Fixed upstream: https://bugs.python.org/issue31158 -Patch285: 00285-fix-non-deterministic-read-in-test_pty.patch - -# 00287 # -# On the creation of io.FileIO() and builtin file() objects the GIL is now released -# when checking the file descriptor. io.FileIO.readall(), io.FileIO.read(), and -# file.read() also now release the GIL when getting the file size, which fixes hanging -# of all threads when trying to access an inaccessible NFS server. -# Fixed upstream: https://bugs.python.org/issue32186 -Patch287: 00287-fix-thread-hanging-on-inaccessible-nfs-server.patch - # 00288 # # Adds a warning when /usr/bin/python is invoked during rpmbuild # See https://fedoraproject.org/wiki/Changes/Avoid_usr_bin_python_in_RPM_Build @@ -760,30 +730,6 @@ Patch288: 00288-ambiguous-python-version-rpmbuild-warn.patch # (we handle it it in Setup.dist, see Patch0) Patch289: 00289-disable-nis-detection.patch -# 00293 # -# Fix over-alignment of _gc_head, the structure for GC information -# See https://bugzilla.redhat.com/show_bug.cgi?id=1540316 -Patch293: 00293-fix-gc-alignment.patch - -# 00297 # -# Fix -Wint-in-bool-context warnings that show up when compiling Python -# (and, more importantly, Python libraries) with newer GCC. -# See https://bugzilla.redhat.com/show_bug.cgi?id=1473425 -# Fixed upstream: https://github.com/python/cpython/pull/3581 -Patch297: 00297-fix-int-in-bool-context-warnings.patch - -# 00298 # -# The SSL module no longer sends IP addresses in SNI TLS extension on -# platforms with OpenSSL 1.0.2+ or inet_pton. -# Fixed upstream: https://bugs.python.org/issue32185 -Patch298: 00298-do-not-send-IP-in-SNI-TLS-extension.patch - -# 00299 # -# Fix ssl module, Python 2.7 doesn't have Py_MAX -# The previous patch 298 broke python2. This is a fixup. -# Fixed upstream: https://github.com/python/cpython/pull/5878 -Patch299: 00299-fix-ssl-module-pymax.patch - # (New patches go here ^^^) # # When adding new patches to "python2" and "python3" in Fedora, EL, etc., @@ -1091,17 +1037,8 @@ mv Modules/cryptmodule.c Modules/_cryptmodule.c %if %{with rewheel} %patch198 -p1 %endif -%patch280 -p1 -%patch283 -p1 -%patch284 -p1 -%patch285 -p1 -%patch287 -p1 %patch288 -p1 %patch289 -p1 -%patch293 -p1 -%patch297 -p1 -%patch298 -p1 -%patch299 -p1 %if 0%{?_module_build} @@ -1999,6 +1936,9 @@ CheckPython \ # ====================================================== %changelog +* Tue May 01 2018 Miro Hrončok - 2.7.15-1 +- Update to version 2.7.15 + * Wed Apr 25 2018 Tomas Orsava - 2.7.14-17 - Change shebangs to the proper versioned binary - Bytecompile files manually, disbale brp-python-bytecompile diff --git a/sources b/sources index dd576a7..e5dbb80 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -SHA512 (Python-2.7.14.tar.xz) = 78310b0be6388ffa15f29a80afb9ab3c03a572cb094e9da00cfe391afadb51696e41f592eb658d6a31a2f422fdac8a55214a382cbb8cfb43d4a127d5b35ea7f9 +SHA512 (Python-2.7.15.tar.xz) = 27ea43eb45fc68f3d2469d5f07636e10801dee11635a430ec8ec922ed790bb426b072da94df885e4dfa1ea8b7a24f2f56dd92f9b0f51e162330f161216bd6de6