From 3ef90dfc66385d6cd8988e2975186968d4697cde Mon Sep 17 00:00:00 2001 From: Charalampos Stratakis Date: Thu, 29 Mar 2018 16:03:33 +0200 Subject: [PATCH] Update to 3.6.5 Rebased patches: 102, 111, 262 Removed patches due to being upstreamed: 264, 273, 298 Update pip version to 9.0.3 --- 00102-lib64.patch | 2 +- 00111-no-static-lib.patch | 12 +- 00262-pep538_coerce_legacy_c_locale.patch | 12 - 00264-skip-test-failing-on-aarch64.patch | 12 - 00270-fix-ssl-alpn-hook-test.patch | 16 -- ...1-asyncio-get-default-signal-handler.patch | 99 -------- 00272-fix-ftplib-to-reject-newlines.patch | 58 ----- ...x-localeconv-encoding-for-LC_NUMERIC.patch | 240 ------------------ 00277-fix-test-subprocess-hanging-tests.patch | 43 ---- ...mory-corruption-due-to-allocator-mix.patch | 13 - ...-do-not-send-IP-in-SNI-TLS-extension.patch | 60 ----- python3.spec | 34 +-- sources | 2 +- 13 files changed, 14 insertions(+), 589 deletions(-) delete mode 100644 00264-skip-test-failing-on-aarch64.patch delete mode 100644 00270-fix-ssl-alpn-hook-test.patch delete mode 100644 00271-asyncio-get-default-signal-handler.patch delete mode 100644 00272-fix-ftplib-to-reject-newlines.patch delete mode 100644 00273-fix-localeconv-encoding-for-LC_NUMERIC.patch delete mode 100644 00277-fix-test-subprocess-hanging-tests.patch delete mode 100644 00279-fix-memory-corruption-due-to-allocator-mix.patch delete mode 100644 00298-do-not-send-IP-in-SNI-TLS-extension.patch diff --git a/00102-lib64.patch b/00102-lib64.patch index 8eea66d..2b913ca 100644 --- a/00102-lib64.patch +++ b/00102-lib64.patch @@ -110,7 +110,7 @@ index f698927..bc977b5 100644 @@ -248,8 +248,8 @@ class HelperFunctionsTests(unittest.TestCase): self.assertEqual(dirs[1], wanted) elif os.sep == '/': - # OS X non-framwework builds, Linux, FreeBSD, etc + # OS X non-framework builds, Linux, FreeBSD, etc - self.assertEqual(len(dirs), 1) - wanted = os.path.join('xoxo', 'lib', + self.assertEqual(len(dirs), 2) diff --git a/00111-no-static-lib.patch b/00111-no-static-lib.patch index 6929fda..bc4203d 100644 --- a/00111-no-static-lib.patch +++ b/00111-no-static-lib.patch @@ -1,9 +1,9 @@ diff --git a/Makefile.pre.in b/Makefile.pre.in -index 70e5927..04c8e3d 100644 +index 4b093e3..1088435 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in -@@ -556,7 +556,7 @@ clinic: $(BUILDPYTHON) $(srcdir)/Modules/_blake2/blake2s_impl.c - $(RUNSHARED) $(PYTHON_FOR_BUILD) ./Tools/clinic/clinic.py --make +@@ -543,7 +543,7 @@ clinic: check-clean-src $(srcdir)/Modules/_blake2/blake2s_impl.c + $(PYTHON_FOR_REGEN) ./Tools/clinic/clinic.py --make # Build the interpreter -$(BUILDPYTHON): Programs/python.o $(LIBRARY) $(LDLIBRARY) $(PY3LIBRARY) @@ -11,7 +11,7 @@ index 70e5927..04c8e3d 100644 $(LINKCC) $(PY_LDFLAGS) $(LINKFORSHARED) -o $@ Programs/python.o $(BLDLIBRARY) $(LIBS) $(MODLIBS) $(SYSLIBS) $(LDLAST) platform: $(BUILDPYTHON) pybuilddir.txt -@@ -601,18 +601,6 @@ sharedmods: $(BUILDPYTHON) pybuilddir.txt Modules/_math.o +@@ -588,18 +588,6 @@ sharedmods: $(BUILDPYTHON) pybuilddir.txt Modules/_math.o $(PYTHON_FOR_BUILD) $(srcdir)/setup.py $$quiet build @@ -30,7 +30,7 @@ index 70e5927..04c8e3d 100644 libpython$(LDVERSION).so: $(LIBRARY_OBJS) if test $(INSTSONAME) != $(LDLIBRARY); then \ $(BLDSHARED) -Wl,-h$(INSTSONAME) -o $(INSTSONAME) $(LIBRARY_OBJS) $(MODLIBS) $(SHLIBS) $(LIBC) $(LIBM) $(LDLAST); \ -@@ -702,7 +690,7 @@ Modules/Setup: $(srcdir)/Modules/Setup.dist +@@ -689,7 +677,7 @@ Modules/Setup: $(srcdir)/Modules/Setup.dist echo "-----------------------------------------------"; \ fi @@ -39,7 +39,7 @@ index 70e5927..04c8e3d 100644 $(LINKCC) $(PY_LDFLAGS) $(LINKFORSHARED) -o $@ Programs/_testembed.o $(BLDLIBRARY) $(LIBS) $(MODLIBS) $(SYSLIBS) $(LDLAST) ############################################################################ -@@ -1382,18 +1370,6 @@ libainstall: all python-config +@@ -1425,18 +1413,6 @@ libainstall: @DEF_MAKE_RULE@ python-config else true; \ fi; \ done diff --git a/00262-pep538_coerce_legacy_c_locale.patch b/00262-pep538_coerce_legacy_c_locale.patch index b144ba5..4a640fd 100644 --- a/00262-pep538_coerce_legacy_c_locale.patch +++ b/00262-pep538_coerce_legacy_c_locale.patch @@ -542,18 +542,6 @@ diff --git a/Lib/test/test_cmd_line.py b/Lib/test/test_cmd_line.py index ae2bcd4..0a302ff 100644 --- a/Lib/test/test_cmd_line.py +++ b/Lib/test/test_cmd_line.py -@@ -9,8 +9,9 @@ import sys - import subprocess - import tempfile - from test.support import script_helper, is_android --from test.support.script_helper import (spawn_python, kill_python, assert_python_ok, -- assert_python_failure) -+from test.support.script_helper import ( -+ spawn_python, kill_python, assert_python_ok, assert_python_failure -+) - - - # XXX (ncoghlan): Move to script_helper and make consistent with run_python @@ -151,6 +152,7 @@ class CmdLineTest(unittest.TestCase): env = os.environ.copy() # Use C locale to get ascii for the locale encoding diff --git a/00264-skip-test-failing-on-aarch64.patch b/00264-skip-test-failing-on-aarch64.patch deleted file mode 100644 index edda219..0000000 --- a/00264-skip-test-failing-on-aarch64.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff --git a/Lib/ctypes/test/test_structures.py b/Lib/ctypes/test/test_structures.py -index 3eded77..ad7859a 100644 ---- a/Lib/ctypes/test/test_structures.py -+++ b/Lib/ctypes/test/test_structures.py -@@ -392,6 +392,7 @@ class StructureTestCase(unittest.TestCase): - (1, 0, 0, 0, 0, 0)) - self.assertRaises(TypeError, lambda: Z(1, 2, 3, 4, 5, 6, 7)) - -+ @unittest.skip('Fails on aarch64: http://bugs.python.org/issue29804') - def test_pass_by_value(self): - # This should mirror the structure in Modules/_ctypes/_ctypes_test.c - class X(Structure): diff --git a/00270-fix-ssl-alpn-hook-test.patch b/00270-fix-ssl-alpn-hook-test.patch deleted file mode 100644 index 97b433e..0000000 --- a/00270-fix-ssl-alpn-hook-test.patch +++ /dev/null @@ -1,16 +0,0 @@ -diff --git a/Lib/test/test_ssl.py b/Lib/test/test_ssl.py -index d203cdd..c128dae 100644 ---- a/Lib/test/test_ssl.py -+++ b/Lib/test/test_ssl.py -@@ -3256,8 +3256,9 @@ if _have_threads: - except ssl.SSLError as e: - stats = e - -- if expected is None and IS_OPENSSL_1_1: -- # OpenSSL 1.1.0 raises handshake error -+ if (expected is None and IS_OPENSSL_1_1 -+ and ssl.OPENSSL_VERSION_INFO < (1, 1, 0, 6)): -+ # OpenSSL 1.1.0 to 1.1.0e raises handshake error - self.assertIsInstance(stats, ssl.SSLError) - else: - msg = "failed trying %s (s) and %s (c).\n" \ diff --git a/00271-asyncio-get-default-signal-handler.patch b/00271-asyncio-get-default-signal-handler.patch deleted file mode 100644 index 8b1bf77..0000000 --- a/00271-asyncio-get-default-signal-handler.patch +++ /dev/null @@ -1,99 +0,0 @@ -diff --git a/Lib/test/test_asyncio/test_events.py b/Lib/test/test_asyncio/test_events.py -index 492a84a2313..9746678607c 100644 ---- a/Lib/test/test_asyncio/test_events.py -+++ b/Lib/test/test_asyncio/test_events.py -@@ -1980,19 +1980,26 @@ def test_subprocess_terminate(self): - - @unittest.skipIf(sys.platform == 'win32', "Don't have SIGHUP") - def test_subprocess_send_signal(self): -- prog = os.path.join(os.path.dirname(__file__), 'echo.py') -- -- connect = self.loop.subprocess_exec( -- functools.partial(MySubprocessProtocol, self.loop), -- sys.executable, prog) -- transp, proto = self.loop.run_until_complete(connect) -- self.assertIsInstance(proto, MySubprocessProtocol) -- self.loop.run_until_complete(proto.connected) -- -- transp.send_signal(signal.SIGHUP) -- self.loop.run_until_complete(proto.completed) -- self.assertEqual(-signal.SIGHUP, proto.returncode) -- transp.close() -+ # bpo-31034: Make sure that we get the default signal handler (killing -+ # the process). The parent process may have decided to ignore SIGHUP, -+ # and signal handlers are inherited. -+ old_handler = signal.signal(signal.SIGHUP, signal.SIG_DFL) -+ try: -+ prog = os.path.join(os.path.dirname(__file__), 'echo.py') -+ -+ connect = self.loop.subprocess_exec( -+ functools.partial(MySubprocessProtocol, self.loop), -+ sys.executable, prog) -+ transp, proto = self.loop.run_until_complete(connect) -+ self.assertIsInstance(proto, MySubprocessProtocol) -+ self.loop.run_until_complete(proto.connected) -+ -+ transp.send_signal(signal.SIGHUP) -+ self.loop.run_until_complete(proto.completed) -+ self.assertEqual(-signal.SIGHUP, proto.returncode) -+ transp.close() -+ finally: -+ signal.signal(signal.SIGHUP, old_handler) - - def test_subprocess_stderr(self): - prog = os.path.join(os.path.dirname(__file__), 'echo2.py') -diff --git a/Lib/test/test_asyncio/test_subprocess.py b/Lib/test/test_asyncio/test_subprocess.py -index 2e14a8a9735..e8822c36698 100644 ---- a/Lib/test/test_asyncio/test_subprocess.py -+++ b/Lib/test/test_asyncio/test_subprocess.py -@@ -166,25 +166,32 @@ def test_terminate(self): - - @unittest.skipIf(sys.platform == 'win32', "Don't have SIGHUP") - def test_send_signal(self): -- code = 'import time; print("sleeping", flush=True); time.sleep(3600)' -- args = [sys.executable, '-c', code] -- create = asyncio.create_subprocess_exec(*args, -- stdout=subprocess.PIPE, -- loop=self.loop) -- proc = self.loop.run_until_complete(create) -- -- @asyncio.coroutine -- def send_signal(proc): -- # basic synchronization to wait until the program is sleeping -- line = yield from proc.stdout.readline() -- self.assertEqual(line, b'sleeping\n') -+ # bpo-31034: Make sure that we get the default signal handler (killing -+ # the process). The parent process may have decided to ignore SIGHUP, -+ # and signal handlers are inherited. -+ old_handler = signal.signal(signal.SIGHUP, signal.SIG_DFL) -+ try: -+ code = 'import time; print("sleeping", flush=True); time.sleep(3600)' -+ args = [sys.executable, '-c', code] -+ create = asyncio.create_subprocess_exec(*args, -+ stdout=subprocess.PIPE, -+ loop=self.loop) -+ proc = self.loop.run_until_complete(create) - -- proc.send_signal(signal.SIGHUP) -- returncode = (yield from proc.wait()) -- return returncode -- -- returncode = self.loop.run_until_complete(send_signal(proc)) -- self.assertEqual(-signal.SIGHUP, returncode) -+ @asyncio.coroutine -+ def send_signal(proc): -+ # basic synchronization to wait until the program is sleeping -+ line = yield from proc.stdout.readline() -+ self.assertEqual(line, b'sleeping\n') -+ -+ proc.send_signal(signal.SIGHUP) -+ returncode = (yield from proc.wait()) -+ return returncode -+ -+ returncode = self.loop.run_until_complete(send_signal(proc)) -+ self.assertEqual(-signal.SIGHUP, returncode) -+ finally: -+ signal.signal(signal.SIGHUP, old_handler) - - def prepare_broken_pipe_test(self): - # buffer large enough to feed the whole pipe buffer diff --git a/00272-fix-ftplib-to-reject-newlines.patch b/00272-fix-ftplib-to-reject-newlines.patch deleted file mode 100644 index 66486a8..0000000 --- a/00272-fix-ftplib-to-reject-newlines.patch +++ /dev/null @@ -1,58 +0,0 @@ -From 8c2d4cf092c5f0335e7982392a33927579c4d512 Mon Sep 17 00:00:00 2001 -From: Dong-hee Na -Date: Wed, 26 Jul 2017 21:11:25 +0900 -Subject: [PATCH] [3.6] bpo-30119: fix ftplib.FTP.putline() to throw an error - for a illegal command (#1214) (#2886) - ---- - Lib/ftplib.py | 2 ++ - Lib/test/test_ftplib.py | 6 +++++- - Misc/NEWS.d/next/Library/2017-07-26-15-15-00.bpo-30119.DZ6C_S.rst | 2 ++ - 3 files changed, 9 insertions(+), 1 deletion(-) - create mode 100644 Misc/NEWS.d/next/Library/2017-07-26-15-15-00.bpo-30119.DZ6C_S.rst - -diff --git a/Lib/ftplib.py b/Lib/ftplib.py -index 8f36f537e8a..a02e595cb02 100644 ---- a/Lib/ftplib.py -+++ b/Lib/ftplib.py -@@ -186,6 +186,8 @@ def sanitize(self, s): - - # Internal: send one line to the server, appending CRLF - def putline(self, line): -+ if '\r' in line or '\n' in line: -+ raise ValueError('an illegal newline character should not be contained') - line = line + CRLF - if self.debugging > 1: - print('*put*', self.sanitize(line)) -diff --git a/Lib/test/test_ftplib.py b/Lib/test/test_ftplib.py -index 12fabc5e8be..a561e9efa03 100644 ---- a/Lib/test/test_ftplib.py -+++ b/Lib/test/test_ftplib.py -@@ -484,6 +484,9 @@ def test_sanitize(self): - self.assertEqual(self.client.sanitize('PASS 12345'), repr('PASS *****')) - - def test_exceptions(self): -+ self.assertRaises(ValueError, self.client.sendcmd, 'echo 40\r\n0') -+ self.assertRaises(ValueError, self.client.sendcmd, 'echo 40\n0') -+ self.assertRaises(ValueError, self.client.sendcmd, 'echo 40\r0') - self.assertRaises(ftplib.error_temp, self.client.sendcmd, 'echo 400') - self.assertRaises(ftplib.error_temp, self.client.sendcmd, 'echo 499') - self.assertRaises(ftplib.error_perm, self.client.sendcmd, 'echo 500') -@@ -492,7 +495,8 @@ def test_exceptions(self): - - def test_all_errors(self): - exceptions = (ftplib.error_reply, ftplib.error_temp, ftplib.error_perm, -- ftplib.error_proto, ftplib.Error, OSError, EOFError) -+ ftplib.error_proto, ftplib.Error, OSError, -+ EOFError) - for x in exceptions: - try: - raise x('exception not included in all_errors set') -diff --git a/Misc/NEWS.d/next/Library/2017-07-26-15-15-00.bpo-30119.DZ6C_S.rst b/Misc/NEWS.d/next/Library/2017-07-26-15-15-00.bpo-30119.DZ6C_S.rst -new file mode 100644 -index 00000000000..a37d3703842 ---- /dev/null -+++ b/Misc/NEWS.d/next/Library/2017-07-26-15-15-00.bpo-30119.DZ6C_S.rst -@@ -0,0 +1,2 @@ -+ftplib.FTP.putline() now throws ValueError on commands that contains CR or -+LF. Patch by Dong-hee Na. diff --git a/00273-fix-localeconv-encoding-for-LC_NUMERIC.patch b/00273-fix-localeconv-encoding-for-LC_NUMERIC.patch deleted file mode 100644 index 4d0c87d..0000000 --- a/00273-fix-localeconv-encoding-for-LC_NUMERIC.patch +++ /dev/null @@ -1,240 +0,0 @@ -diff --git a/Doc/library/locale.rst b/Doc/library/locale.rst -index b04442bc162..9a0c570533a 100644 ---- a/Doc/library/locale.rst -+++ b/Doc/library/locale.rst -@@ -147,6 +147,16 @@ The :mod:`locale` module defines the following exception and functions: - | ``CHAR_MAX`` | Nothing is specified in this locale. | - +--------------+-----------------------------------------+ - -+ The function sets temporarily the ``LC_CTYPE`` locale to the ``LC_NUMERIC`` -+ locale to decode ``decimal_point`` and ``thousands_sep`` byte strings if -+ they are non-ASCII or longer than 1 byte, and the ``LC_NUMERIC`` locale is -+ different than the ``LC_CTYPE`` locale. This temporary change affects other -+ threads. -+ -+ .. versionchanged:: 3.6.5 -+ The function now sets temporarily the ``LC_CTYPE`` locale to the -+ ``LC_NUMERIC`` locale in some cases. -+ - - .. function:: nl_langinfo(option) - -diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst -index 196a4c00056..d8a1647e8b5 100644 ---- a/Doc/library/stdtypes.rst -+++ b/Doc/library/stdtypes.rst -@@ -1599,6 +1599,20 @@ expression support in the :mod:`re` module). - See :ref:`formatstrings` for a description of the various formatting options - that can be specified in format strings. - -+ .. note:: -+ When formatting a number (:class:`int`, :class:`float`, :class:`float` -+ and subclasses) with the ``n`` type (ex: ``'{:n}'.format(1234)``), the -+ function sets temporarily the ``LC_CTYPE`` locale to the ``LC_NUMERIC`` -+ locale to decode ``decimal_point`` and ``thousands_sep`` fields of -+ :c:func:`localeconv` if they are non-ASCII or longer than 1 byte, and the -+ ``LC_NUMERIC`` locale is different than the ``LC_CTYPE`` locale. This -+ temporary change affects other threads. -+ -+ .. versionchanged:: 3.6.5 -+ When formatting a number with the ``n`` type, the function sets -+ temporarily the ``LC_CTYPE`` locale to the ``LC_NUMERIC`` locale in some -+ cases. -+ - - .. method:: str.format_map(mapping) - -diff --git a/Doc/whatsnew/3.6.rst b/Doc/whatsnew/3.6.rst -index 847b50140a6..f83508c9250 100644 ---- a/Doc/whatsnew/3.6.rst -+++ b/Doc/whatsnew/3.6.rst -@@ -2346,3 +2346,11 @@ It has been replaced by the new ``make regen-all`` target. - (Contributed by Victor Stinner in :issue:`23404`.) - - .. versionchanged:: 3.6.2 -+ -+ -+Notable changes in Python 3.6.5 -+=============================== -+ -+The :func:`locale.localeconv` function now sets temporarily the ``LC_CTYPE`` -+locale to the ``LC_NUMERIC`` locale in some cases. -+(Contributed by Victor Stinner in :issue:`31900`.) -diff --git a/Include/fileutils.h b/Include/fileutils.h -index 900c70faad7..875715df97a 100644 ---- a/Include/fileutils.h -+++ b/Include/fileutils.h -@@ -119,6 +119,11 @@ PyAPI_FUNC(int) _Py_get_blocking(int fd); - PyAPI_FUNC(int) _Py_set_blocking(int fd, int blocking); - #endif /* !MS_WINDOWS */ - -+PyAPI_FUNC(int) _Py_GetLocaleconvNumeric( -+ PyObject **decimal_point, -+ PyObject **thousands_sep, -+ const char **grouping); -+ - #endif /* Py_LIMITED_API */ - - #ifdef __cplusplus -diff --git a/Modules/_localemodule.c b/Modules/_localemodule.c -index 71c9146ccb8..95b370b1ad0 100644 ---- a/Modules/_localemodule.c -+++ b/Modules/_localemodule.c -@@ -171,12 +171,6 @@ PyLocale_localeconv(PyObject* self) - RESULT(#i, x); \ - } while (0) - -- /* Numeric information */ -- RESULT_STRING(decimal_point); -- RESULT_STRING(thousands_sep); -- x = copy_grouping(l->grouping); -- RESULT("grouping", x); -- - /* Monetary information */ - RESULT_STRING(int_curr_symbol); - RESULT_STRING(currency_symbol); -@@ -195,6 +189,32 @@ PyLocale_localeconv(PyObject* self) - RESULT_INT(n_sep_by_space); - RESULT_INT(p_sign_posn); - RESULT_INT(n_sign_posn); -+ -+ /* Numeric information */ -+ PyObject *decimal_point, *thousands_sep; -+ const char *grouping; -+ if (_Py_GetLocaleconvNumeric(&decimal_point, -+ &thousands_sep, -+ &grouping) < 0) { -+ goto failed; -+ } -+ -+ if (PyDict_SetItemString(result, "decimal_point", decimal_point) < 0) { -+ Py_DECREF(decimal_point); -+ Py_DECREF(thousands_sep); -+ goto failed; -+ } -+ Py_DECREF(decimal_point); -+ -+ if (PyDict_SetItemString(result, "thousands_sep", thousands_sep) < 0) { -+ Py_DECREF(thousands_sep); -+ goto failed; -+ } -+ Py_DECREF(thousands_sep); -+ -+ x = copy_grouping(grouping); -+ RESULT("grouping", x); -+ - return result; - - failed: -diff --git a/Python/fileutils.c b/Python/fileutils.c -index 97505e5bc6d..14dd81b03f0 100644 ---- a/Python/fileutils.c -+++ b/Python/fileutils.c -@@ -1597,3 +1597,80 @@ _Py_set_blocking(int fd, int blocking) - return -1; - } - #endif -+ -+ -+int -+_Py_GetLocaleconvNumeric(PyObject **decimal_point, PyObject **thousands_sep, -+ const char **grouping) -+{ -+ int res = -1; -+ -+ struct lconv *lc = localeconv(); -+ -+ int change_locale = 0; -+ if (decimal_point != NULL && -+ (strlen(lc->decimal_point) > 1 || ((unsigned char)lc->decimal_point[0]) > 127)) -+ { -+ change_locale = 1; -+ } -+ if (thousands_sep != NULL && -+ (strlen(lc->thousands_sep) > 1 || ((unsigned char)lc->thousands_sep[0]) > 127)) -+ { -+ change_locale = 1; -+ } -+ -+ /* Keep a copy of the LC_CTYPE locale */ -+ char *oldloc = NULL, *loc = NULL; -+ if (change_locale) { -+ oldloc = setlocale(LC_CTYPE, NULL); -+ if (!oldloc) { -+ PyErr_SetString(PyExc_RuntimeWarning, "faild to get LC_CTYPE locale"); -+ return -1; -+ } -+ -+ oldloc = _PyMem_Strdup(oldloc); -+ if (!oldloc) { -+ PyErr_NoMemory(); -+ return -1; -+ } -+ -+ loc = setlocale(LC_NUMERIC, NULL); -+ if (loc != NULL && strcmp(loc, oldloc) == 0) { -+ loc = NULL; -+ } -+ -+ if (loc != NULL) { -+ /* Only set the locale temporarilty the LC_CTYPE locale -+ if LC_NUMERIC locale is different than LC_CTYPE locale and -+ decimal_point and/or thousands_sep are non-ASCII or longer than -+ 1 byte */ -+ setlocale(LC_CTYPE, loc); -+ } -+ } -+ -+ if (decimal_point != NULL) { -+ *decimal_point = PyUnicode_DecodeLocale(lc->decimal_point, NULL); -+ if (*decimal_point == NULL) { -+ goto error; -+ } -+ } -+ if (thousands_sep != NULL) { -+ *thousands_sep = PyUnicode_DecodeLocale(lc->thousands_sep, NULL); -+ if (*thousands_sep == NULL) { -+ goto error; -+ } -+ } -+ -+ if (grouping != NULL) { -+ *grouping = lc->grouping; -+ } -+ -+ res = 0; -+ -+error: -+ if (loc != NULL) { -+ setlocale(LC_CTYPE, oldloc); -+ } -+ PyMem_Free(oldloc); -+ return res; -+} -diff --git a/Python/formatter_unicode.c b/Python/formatter_unicode.c -index d2be76f1e1a..d3ef650e6ce 100644 ---- a/Python/formatter_unicode.c -+++ b/Python/formatter_unicode.c -@@ -707,18 +707,11 @@ get_locale_info(enum LocaleType type, LocaleInfo *locale_info) - { - switch (type) { - case LT_CURRENT_LOCALE: { -- struct lconv *locale_data = localeconv(); -- locale_info->decimal_point = PyUnicode_DecodeLocale( -- locale_data->decimal_point, -- NULL); -- if (locale_info->decimal_point == NULL) -+ if (_Py_GetLocaleconvNumeric(&locale_info->decimal_point, -+ &locale_info->thousands_sep, -+ &locale_info->grouping) < 0) { - return -1; -- locale_info->thousands_sep = PyUnicode_DecodeLocale( -- locale_data->thousands_sep, -- NULL); -- if (locale_info->thousands_sep == NULL) -- return -1; -- locale_info->grouping = locale_data->grouping; -+ } - break; - } - case LT_DEFAULT_LOCALE: diff --git a/00277-fix-test-subprocess-hanging-tests.patch b/00277-fix-test-subprocess-hanging-tests.patch deleted file mode 100644 index c9b54e2..0000000 --- a/00277-fix-test-subprocess-hanging-tests.patch +++ /dev/null @@ -1,43 +0,0 @@ -From 54849962eacc38f4e6c6f8a72ae258b3e7c2ecd5 Mon Sep 17 00:00:00 2001 -From: Victor Stinner -Date: Thu, 5 Oct 2017 15:05:30 +0200 -Subject: [PATCH] bpo-31178: Mock os.waitpid() in test_subprocess - -Fix test_exception_errpipe_bad_data() and -test_exception_errpipe_normal() of test_subprocess: mock os.waitpid() -to avoid calling the real os.waitpid(0, 0) which is an unexpected -side effect of the test. ---- - Lib/test/test_subprocess.py | 12 ++++++++---- - 1 file changed, 8 insertions(+), 4 deletions(-) - -diff --git a/Lib/test/test_subprocess.py b/Lib/test/test_subprocess.py -index 00dc37bc2c7..3ba5c028517 100644 ---- a/Lib/test/test_subprocess.py -+++ b/Lib/test/test_subprocess.py -@@ -1559,8 +1559,10 @@ def proper_error(*args): - - fork_exec.side_effect = proper_error - -- with self.assertRaises(IsADirectoryError): -- self.PopenNoDestructor(["non_existent_command"]) -+ with mock.patch("subprocess.os.waitpid", -+ side_effect=ChildProcessError): -+ with self.assertRaises(IsADirectoryError): -+ self.PopenNoDestructor(["non_existent_command"]) - - @mock.patch("subprocess._posixsubprocess.fork_exec") - def test_exception_errpipe_bad_data(self, fork_exec): -@@ -1577,8 +1579,10 @@ def bad_error(*args): - - fork_exec.side_effect = bad_error - -- with self.assertRaises(subprocess.SubprocessError) as e: -- self.PopenNoDestructor(["non_existent_command"]) -+ with mock.patch("subprocess.os.waitpid", -+ side_effect=ChildProcessError): -+ with self.assertRaises(subprocess.SubprocessError) as e: -+ self.PopenNoDestructor(["non_existent_command"]) - - self.assertIn(repr(error_data), str(e.exception)) - diff --git a/00279-fix-memory-corruption-due-to-allocator-mix.patch b/00279-fix-memory-corruption-due-to-allocator-mix.patch deleted file mode 100644 index 4937391..0000000 --- a/00279-fix-memory-corruption-due-to-allocator-mix.patch +++ /dev/null @@ -1,13 +0,0 @@ -diff --git a/Modules/getpath.c b/Modules/getpath.c -index c4055be..1258fcd 100644 ---- a/Modules/getpath.c -+++ b/Modules/getpath.c -@@ -735,7 +735,7 @@ calculate_path(void) - bufsz += wcslen(zip_path) + 1; - bufsz += wcslen(exec_prefix) + 1; - -- buf = PyMem_New(wchar_t, bufsz); -+ buf = PyMem_RawMalloc(bufsz * sizeof(wchar_t)); - if (buf == NULL) { - Py_FatalError( - "Not enough memory for dynamic PYTHONPATH"); 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 19b6b31..0000000 --- a/00298-do-not-send-IP-in-SNI-TLS-extension.patch +++ /dev/null @@ -1,60 +0,0 @@ -diff --git a/Modules/_ssl.c b/Modules/_ssl.c -index df8c6a7d96d8..e8cffef14de0 100644 ---- a/Modules/_ssl.c -+++ b/Modules/_ssl.c -@@ -55,6 +55,11 @@ static PySocketModule_APIObject PySocketModule; - #include - #endif - -+#ifndef MS_WINDOWS -+/* inet_pton */ -+#include -+#endif -+ - /* Don't warn about deprecated functions */ - #ifdef __GNUC__ - #pragma GCC diagnostic ignored "-Wdeprecated-declarations" -@@ -667,8 +672,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/python3.spec b/python3.spec index 814679f..a86e1b7 100644 --- a/python3.spec +++ b/python3.spec @@ -13,8 +13,8 @@ URL: https://www.python.org/ # WARNING When rebasing to a new Python version, # remember to update the python3-docs package as well -Version: %{pybasever}.4 -Release: 12%{?dist} +Version: %{pybasever}.5 +Release: 1%{?dist} License: Python @@ -332,18 +332,6 @@ Patch251: 00251-change-user-install-location.patch # Original proposal: https://bugzilla.redhat.com/show_bug.cgi?id=1404918 Patch262: 00262-pep538_coerce_legacy_c_locale.patch -# 00264 # -# test_pass_by_value was added in Python 3.6.1 and on aarch64 -# it is catching an error that was there, but wasn't tested before. -# Therefore skipping the test on aarch64 until fixed upstream. -# Reported upstream: http://bugs.python.org/issue29804 -Patch264: 00264-skip-test-failing-on-aarch64.patch - -# 00273 # -# Fix localeconv() encoding for LC_NUMERIC -# Fixed upstream: https://bugs.python.org/issue31900 -Patch273: 00273-fix-localeconv-encoding-for-LC_NUMERIC.patch - # 00274 # # Upstream uses Debian-style architecture naming. Change to match Fedora. Patch274: 00274-fix-arch-names.patch @@ -362,12 +350,6 @@ Patch292: 00292-restore-PyExc_RecursionErrorInst-symbol.patch # See also: https://bugzilla.redhat.com/show_bug.cgi?id=1489816 Patch294: 00294-define-TLS-cipher-suite-on-build-time.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 - # 00301 # # Tools/scripts/pathfix.py: Add -n option for no backup~ # See: https://bugzilla.redhat.com/show_bug.cgi?id=1546990 @@ -583,7 +565,7 @@ rm -r Modules/expat rm -r Modules/zlib %if %{with rewheel} -%global pip_version 9.0.1 +%global pip_version 9.0.3 sed -r -i s/'_PIP_VERSION = "[0-9.]+"'/'_PIP_VERSION = "%{pip_version}"'/ Lib/ensurepip/__init__.py %endif @@ -610,16 +592,9 @@ sed -r -i s/'_PIP_VERSION = "[0-9.]+"'/'_PIP_VERSION = "%{pip_version}"'/ Lib/en %patch205 -p1 %patch251 -p1 %patch262 -p1 - -%ifarch aarch64 -%patch264 -p1 -%endif - -%patch273 -p1 %patch274 -p1 %patch292 -p1 %patch294 -p1 -%patch298 -p1 %patch301 -p1 @@ -1487,6 +1462,9 @@ fi # ====================================================== %changelog +* Thu Mar 29 2018 Charalampos Stratakis - 3.6.5-1 +- Update to 3.6.5 + * Sat Mar 24 2018 Miro HronĨok - 3.6.4-12 - Fix broken macro invocation and broken building of C Python extensions Resolves: rhbz#1560103 diff --git a/sources b/sources index 6b5ff13..9d32274 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -SHA512 (Python-3.6.4.tar.xz) = 09ba2103ac517ac4d262f00380c9aac836a53401ce252540c17fd821a3b92e1ddf32528d00772221eb3126b12cb95b62c3ac3e852f4951e6f2eb406c88c848a2 +SHA512 (Python-3.6.5.tar.xz) = 6b26fcd296b9bd8e67861eff10d14db7507711ddba947288d16d6def53135c39326b7f969c04bb2b2993f924d9e7ad3f5c5282a3915760bc0885cf0a8ea5eb51