python3:upgrade python3 from 3.7.4 to 3.8.3
This commit is contained in:
parent
aa972b0782
commit
6d90eb1da6
@ -1,5 +1,5 @@
|
||||
diff --git a/Lib/distutils/command/install.py b/Lib/distutils/command/install.py
|
||||
index 0258d3d..4b969bf 100644
|
||||
index c625c95..ae4f915 100644
|
||||
--- a/Lib/distutils/command/install.py
|
||||
+++ b/Lib/distutils/command/install.py
|
||||
@@ -30,14 +30,14 @@ WINDOWS_SCHEME = {
|
||||
@ -20,10 +20,10 @@ index 0258d3d..4b969bf 100644
|
||||
'scripts': '$base/bin',
|
||||
'data' : '$base',
|
||||
diff --git a/Lib/distutils/sysconfig.py b/Lib/distutils/sysconfig.py
|
||||
index e07a6c8..554740d 100644
|
||||
index b51629e..9a4892a 100644
|
||||
--- a/Lib/distutils/sysconfig.py
|
||||
+++ b/Lib/distutils/sysconfig.py
|
||||
@@ -129,8 +129,12 @@ def get_python_lib(plat_specific=0, standard_lib=0, prefix=None):
|
||||
@@ -146,8 +146,12 @@ def get_python_lib(plat_specific=0, standard_lib=0, prefix=None):
|
||||
prefix = plat_specific and EXEC_PREFIX or PREFIX
|
||||
|
||||
if os.name == "posix":
|
||||
@ -53,10 +53,10 @@ index 287ab19..d4c05e0 100644
|
||||
check_path(cmd.install_headers,
|
||||
os.path.join(destination, "include", "python", "foopkg"))
|
||||
diff --git a/Lib/site.py b/Lib/site.py
|
||||
index 7dc1b04..85016b4 100644
|
||||
index a065ab0..22d53fa 100644
|
||||
--- a/Lib/site.py
|
||||
+++ b/Lib/site.py
|
||||
@@ -334,11 +334,15 @@ def getsitepackages(prefixes=None):
|
||||
@@ -335,11 +335,15 @@ def getsitepackages(prefixes=None):
|
||||
seen.add(prefix)
|
||||
|
||||
if os.sep == '/':
|
||||
@ -73,7 +73,7 @@ index 7dc1b04..85016b4 100644
|
||||
return sitepackages
|
||||
|
||||
diff --git a/Lib/sysconfig.py b/Lib/sysconfig.py
|
||||
index 9ee4d31..53c8606 100644
|
||||
index b9e2faf..0ae6d35 100644
|
||||
--- a/Lib/sysconfig.py
|
||||
+++ b/Lib/sysconfig.py
|
||||
@@ -20,10 +20,10 @@ __all__ = [
|
||||
@ -105,10 +105,10 @@ index 9ee4d31..53c8606 100644
|
||||
'scripts': '{userbase}/bin',
|
||||
'data': '{userbase}',
|
||||
diff --git a/Lib/test/test_site.py b/Lib/test/test_site.py
|
||||
index 266adf0..e8513b6 100644
|
||||
index 1bbc697..9a7e80d 100644
|
||||
--- a/Lib/test/test_site.py
|
||||
+++ b/Lib/test/test_site.py
|
||||
@@ -275,8 +275,8 @@ class HelperFunctionsTests(unittest.TestCase):
|
||||
@@ -267,8 +267,8 @@ class HelperFunctionsTests(unittest.TestCase):
|
||||
dirs = site.getsitepackages()
|
||||
if os.sep == '/':
|
||||
# OS X, Linux, FreeBSD, etc
|
||||
@ -120,10 +120,10 @@ index 266adf0..e8513b6 100644
|
||||
'site-packages')
|
||||
self.assertEqual(dirs[0], wanted)
|
||||
diff --git a/Makefile.pre.in b/Makefile.pre.in
|
||||
index 59ba9d4..5780ed8 100644
|
||||
index a914a9c..406a441 100644
|
||||
--- a/Makefile.pre.in
|
||||
+++ b/Makefile.pre.in
|
||||
@@ -133,7 +133,7 @@ LIBDIR= @libdir@
|
||||
@@ -143,7 +143,7 @@ LIBDIR= @libdir@
|
||||
MANDIR= @mandir@
|
||||
INCLUDEDIR= @includedir@
|
||||
CONFINCLUDEDIR= $(exec_prefix)/include
|
||||
@ -133,29 +133,29 @@ index 59ba9d4..5780ed8 100644
|
||||
|
||||
# Detailed destination directories
|
||||
diff --git a/Modules/getpath.c b/Modules/getpath.c
|
||||
index 85e737b..2a1fc79 100644
|
||||
index b727f66..a0c5fb6 100644
|
||||
--- a/Modules/getpath.c
|
||||
+++ b/Modules/getpath.c
|
||||
@@ -500,7 +500,7 @@ calculate_exec_prefix(const _PyCoreConfig *core_config,
|
||||
"Could not find platform dependent libraries <exec_prefix>\n");
|
||||
@@ -730,7 +730,7 @@ calculate_exec_prefix(PyCalculatePath *calculate, _PyPathConfig *pathconfig,
|
||||
if (safe_wcscpy(exec_prefix, calculate->exec_prefix, exec_prefix_len) < 0) {
|
||||
return PATHLEN_ERR();
|
||||
}
|
||||
wcsncpy(exec_prefix, calculate->exec_prefix, MAXPATHLEN);
|
||||
- joinpath(exec_prefix, L"lib/lib-dynload");
|
||||
+ joinpath(exec_prefix, L"lib64/lib-dynload");
|
||||
- status = joinpath(exec_prefix, L"lib/lib-dynload", exec_prefix_len);
|
||||
+ status = joinpath(exec_prefix, L"lib64/lib-dynload", exec_prefix_len);
|
||||
if (_PyStatus_EXCEPTION(status)) {
|
||||
return status;
|
||||
}
|
||||
/* If we found EXEC_PREFIX do *not* reduce it! (Yet.) */
|
||||
@@ -1067,7 +1067,7 @@ calculate_zip_path(PyCalculatePath *calculate, const wchar_t *prefix,
|
||||
return PATHLEN_ERR();
|
||||
}
|
||||
@@ -742,7 +742,7 @@ calculate_zip_path(PyCalculatePath *calculate, const wchar_t *prefix)
|
||||
else {
|
||||
wcsncpy(calculate->zip_path, calculate->prefix, MAXPATHLEN);
|
||||
}
|
||||
- joinpath(calculate->zip_path, L"lib/python00.zip");
|
||||
+ joinpath(calculate->zip_path, L"lib64/python00.zip");
|
||||
|
||||
/* Replace "00" with version */
|
||||
size_t bufsz = wcslen(calculate->zip_path);
|
||||
@@ -867,7 +867,7 @@ calculate_init(PyCalculatePath *calculate,
|
||||
if (!calculate->prefix) {
|
||||
- status = joinpath(zip_path, L"lib/python00.zip", zip_path_len);
|
||||
+ status = joinpath(zip_path, L"lib64/python00.zip", zip_path_len);
|
||||
if (_PyStatus_EXCEPTION(status)) {
|
||||
return status;
|
||||
}
|
||||
@@ -1197,7 +1197,7 @@ calculate_init(PyCalculatePath *calculate, const PyConfig *config)
|
||||
if (!calculate->exec_prefix) {
|
||||
return DECODE_LOCALE_ERR("EXEC_PREFIX define", len);
|
||||
}
|
||||
- calculate->lib_python = Py_DecodeLocale("lib/python" VERSION, &len);
|
||||
@ -163,30 +163,65 @@ index 85e737b..2a1fc79 100644
|
||||
if (!calculate->lib_python) {
|
||||
return DECODE_LOCALE_ERR("EXEC_PREFIX define", len);
|
||||
}
|
||||
diff --git a/configure b/configure
|
||||
index 8886561..78867c6 100755
|
||||
--- a/configure
|
||||
+++ b/configure
|
||||
@@ -15214,9 +15214,9 @@ fi
|
||||
|
||||
|
||||
if test x$PLATFORM_TRIPLET = x; then
|
||||
- LIBPL='$(prefix)'"/lib/python${VERSION}/config-${LDVERSION}"
|
||||
+ LIBPL='$(prefix)'"/lib64/python${VERSION}/config-${LDVERSION}"
|
||||
else
|
||||
- LIBPL='$(prefix)'"/lib/python${VERSION}/config-${LDVERSION}-${PLATFORM_TRIPLET}"
|
||||
+ LIBPL='$(prefix)'"/lib64/python${VERSION}/config-${LDVERSION}-${PLATFORM_TRIPLET}"
|
||||
fi
|
||||
|
||||
|
||||
diff --git a/configure.ac b/configure.ac
|
||||
index d8de9d4..477a5ff 100644
|
||||
--- a/configure.ac
|
||||
+++ b/configure.ac
|
||||
@@ -4689,9 +4689,9 @@ fi
|
||||
dnl define LIBPL after ABIFLAGS and LDVERSION is defined.
|
||||
AC_SUBST(PY_ENABLE_SHARED)
|
||||
if test x$PLATFORM_TRIPLET = x; then
|
||||
- LIBPL='$(prefix)'"/lib/python${VERSION}/config-${LDVERSION}"
|
||||
+ LIBPL='$(prefix)'"/lib64/python${VERSION}/config-${LDVERSION}"
|
||||
else
|
||||
- LIBPL='$(prefix)'"/lib/python${VERSION}/config-${LDVERSION}-${PLATFORM_TRIPLET}"
|
||||
+ LIBPL='$(prefix)'"/lib64/python${VERSION}/config-${LDVERSION}-${PLATFORM_TRIPLET}"
|
||||
fi
|
||||
AC_SUBST(LIBPL)
|
||||
|
||||
diff --git a/setup.py b/setup.py
|
||||
index f1933f7..450cd8a 100644
|
||||
index b168ed4..8628b9d 100644
|
||||
--- a/setup.py
|
||||
+++ b/setup.py
|
||||
@@ -531,7 +531,7 @@ class PyBuildExt(build_ext):
|
||||
@@ -649,7 +649,7 @@ class PyBuildExt(build_ext):
|
||||
# directories (i.e. '.' and 'Include') must be first. See issue
|
||||
# 10520.
|
||||
if not cross_compiling:
|
||||
if not CROSS_COMPILING:
|
||||
- add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib')
|
||||
+ add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib64')
|
||||
add_dir_to_list(self.compiler.include_dirs, '/usr/local/include')
|
||||
# only change this for cross builds for 3.3, issues on Mageia
|
||||
if cross_compiling:
|
||||
@@ -830,11 +830,11 @@ class PyBuildExt(build_ext):
|
||||
if CROSS_COMPILING:
|
||||
@@ -953,11 +953,11 @@ class PyBuildExt(build_ext):
|
||||
elif curses_library:
|
||||
readline_libs.append(curses_library)
|
||||
elif self.compiler.find_library_file(lib_dirs +
|
||||
elif self.compiler.find_library_file(self.lib_dirs +
|
||||
- ['/usr/lib/termcap'],
|
||||
+ ['/usr/lib64/termcap'],
|
||||
'termcap'):
|
||||
readline_libs.append('termcap')
|
||||
exts.append( Extension('readline', ['readline.c'],
|
||||
self.add(Extension('readline', ['readline.c'],
|
||||
- library_dirs=['/usr/lib/termcap'],
|
||||
+ library_dirs=['/usr/lib64/termcap'],
|
||||
extra_link_args=readline_extra_link_args,
|
||||
libraries=readline_libs))
|
||||
else:
|
||||
--
|
||||
1.8.3.1
|
||||
|
||||
|
||||
@ -1,17 +1,17 @@
|
||||
diff --git a/Makefile.pre.in b/Makefile.pre.in
|
||||
index 0db0dd0..bd8f769 100644
|
||||
index 406a441..917303d 100644
|
||||
--- a/Makefile.pre.in
|
||||
+++ b/Makefile.pre.in
|
||||
@@ -574,7 +574,7 @@ clinic: check-clean-src $(srcdir)/Modules/_blake2/blake2s_impl.c
|
||||
@@ -562,7 +562,7 @@ clinic: check-clean-src $(srcdir)/Modules/_blake2/blake2s_impl.c
|
||||
$(PYTHON_FOR_REGEN) $(srcdir)/Tools/clinic/clinic.py --make --srcdir $(srcdir)
|
||||
|
||||
# Build the interpreter
|
||||
-$(BUILDPYTHON): Programs/python.o $(LIBRARY) $(LDLIBRARY) $(PY3LIBRARY)
|
||||
+$(BUILDPYTHON): Programs/python.o $(LDLIBRARY) $(PY3LIBRARY)
|
||||
$(LINKCC) $(PY_CORE_LDFLAGS) $(LINKFORSHARED) -o $@ Programs/python.o $(BLDLIBRARY) $(LIBS) $(MODLIBS) $(SYSLIBS) $(LDLAST)
|
||||
$(LINKCC) $(PY_CORE_LDFLAGS) $(LINKFORSHARED) -o $@ Programs/python.o $(BLDLIBRARY) $(LIBS) $(MODLIBS) $(SYSLIBS)
|
||||
|
||||
platform: $(BUILDPYTHON) pybuilddir.txt
|
||||
@@ -622,12 +622,6 @@ sharedmods: $(BUILDPYTHON) pybuilddir.txt Modules/_math.o
|
||||
@@ -610,12 +610,6 @@ sharedmods: $(BUILDPYTHON) pybuilddir.txt Modules/_math.o
|
||||
_TCLTK_INCLUDES='$(TCLTK_INCLUDES)' _TCLTK_LIBS='$(TCLTK_LIBS)' \
|
||||
$(PYTHON_FOR_BUILD) $(srcdir)/setup.py $$quiet build
|
||||
|
||||
@ -21,19 +21,19 @@ index 0db0dd0..bd8f769 100644
|
||||
- -rm -f $@
|
||||
- $(AR) $(ARFLAGS) $@ $(LIBRARY_OBJS)
|
||||
-
|
||||
libpython$(LDVERSION).so: $(LIBRARY_OBJS)
|
||||
libpython$(LDVERSION).so: $(LIBRARY_OBJS) $(DTRACE_OBJS)
|
||||
if test $(INSTSONAME) != $(LDLIBRARY); then \
|
||||
$(BLDSHARED) -Wl,-h$(INSTSONAME) -o $(INSTSONAME) $(LIBRARY_OBJS) $(MODLIBS) $(SHLIBS) $(LIBC) $(LIBM) $(LDLAST); \
|
||||
@@ -715,7 +709,7 @@ Modules/Setup: $(srcdir)/Modules/Setup.dist
|
||||
echo "-----------------------------------------------"; \
|
||||
fi
|
||||
$(BLDSHARED) -Wl,-h$(INSTSONAME) -o $(INSTSONAME) $(LIBRARY_OBJS) $(MODLIBS) $(SHLIBS) $(LIBC) $(LIBM); \
|
||||
@@ -693,7 +687,7 @@ Makefile Modules/config.c: Makefile.pre \
|
||||
@echo "The Makefile was updated, you may need to re-run make."
|
||||
|
||||
|
||||
-Programs/_testembed: Programs/_testembed.o $(LIBRARY) $(LDLIBRARY) $(PY3LIBRARY)
|
||||
+Programs/_testembed: Programs/_testembed.o $(LDLIBRARY) $(PY3LIBRARY)
|
||||
$(LINKCC) $(PY_CORE_LDFLAGS) $(LINKFORSHARED) -o $@ Programs/_testembed.o $(BLDLIBRARY) $(LIBS) $(MODLIBS) $(SYSLIBS) $(LDLAST)
|
||||
$(LINKCC) $(PY_CORE_LDFLAGS) $(LINKFORSHARED) -o $@ Programs/_testembed.o $(BLDLIBRARY) $(LIBS) $(MODLIBS) $(SYSLIBS)
|
||||
|
||||
############################################################################
|
||||
@@ -1483,17 +1477,6 @@ libainstall: @DEF_MAKE_RULE@ python-config
|
||||
@@ -1557,17 +1551,6 @@ libainstall: @DEF_MAKE_RULE@ python-config
|
||||
else true; \
|
||||
fi; \
|
||||
done
|
||||
@ -51,3 +51,6 @@ index 0db0dd0..bd8f769 100644
|
||||
$(INSTALL_DATA) Modules/config.c $(DESTDIR)$(LIBPL)/config.c
|
||||
$(INSTALL_DATA) Programs/python.o $(DESTDIR)$(LIBPL)/python.o
|
||||
$(INSTALL_DATA) $(srcdir)/Modules/config.c.in $(DESTDIR)$(LIBPL)/config.c.in
|
||||
--
|
||||
1.8.3.1
|
||||
|
||||
|
||||
@ -1,6 +1,20 @@
|
||||
diff -up Python-3.2.2/Lib/unittest/case.py.add-rpmbuild-hooks-to-unittest Python-3.2.2/Lib/unittest/case.py
|
||||
--- Python-3.2.2/Lib/unittest/case.py.add-rpmbuild-hooks-to-unittest 2011-09-03 12:16:44.000000000 -0400
|
||||
+++ Python-3.2.2/Lib/unittest/case.py 2011-09-09 06:35:16.365568382 -0400
|
||||
diff --git a/Lib/unittest/__init__.py b/Lib/unittest/__init__.py
|
||||
index ace3a6f..a3f76a1 100644
|
||||
--- a/Lib/unittest/__init__.py
|
||||
+++ b/Lib/unittest/__init__.py
|
||||
@@ -59,7 +59,7 @@ __unittest = True
|
||||
from .result import TestResult
|
||||
from .async_case import IsolatedAsyncioTestCase
|
||||
from .case import (addModuleCleanup, TestCase, FunctionTestCase, SkipTest, skip,
|
||||
- skipIf, skipUnless, expectedFailure)
|
||||
+ skipIf, skipUnless, expectedFailure, _skipInRpmBuild)
|
||||
from .suite import BaseTestSuite, TestSuite
|
||||
from .loader import (TestLoader, defaultTestLoader, makeSuite, getTestCaseNames,
|
||||
findTestCases)
|
||||
diff --git a/Lib/unittest/case.py b/Lib/unittest/case.py
|
||||
index e5734b6..b641710 100644
|
||||
--- a/Lib/unittest/case.py
|
||||
+++ b/Lib/unittest/case.py
|
||||
@@ -3,6 +3,7 @@
|
||||
import sys
|
||||
import functools
|
||||
@ -9,7 +23,8 @@ diff -up Python-3.2.2/Lib/unittest/case.py.add-rpmbuild-hooks-to-unittest Python
|
||||
import logging
|
||||
import pprint
|
||||
import re
|
||||
@@ -101,5 +102,21 @@ def expectedFailure(func):
|
||||
@@ -163,6 +164,22 @@ class _BaseTestCaseContext:
|
||||
msg = self.test_case._formatMessage(self.msg, standardMsg)
|
||||
raise self.test_case.failureException(msg)
|
||||
|
||||
+# Non-standard/downstream-only hooks for handling issues with specific test
|
||||
@ -31,16 +46,3 @@ diff -up Python-3.2.2/Lib/unittest/case.py.add-rpmbuild-hooks-to-unittest Python
|
||||
class _AssertRaisesBaseContext(_BaseTestCaseContext):
|
||||
|
||||
def __init__(self, expected, test_case, expected_regex=None):
|
||||
diff -up Python-3.2.2/Lib/unittest/__init__.py.add-rpmbuild-hooks-to-unittest Python-3.2.2/Lib/unittest/__init__.py
|
||||
--- Python-3.2.2/Lib/unittest/__init__.py.add-rpmbuild-hooks-to-unittest 2011-09-03 12:16:44.000000000 -0400
|
||||
+++ Python-3.2.2/Lib/unittest/__init__.py 2011-09-09 06:35:16.366568382 -0400
|
||||
@@ -57,7 +57,8 @@ __unittest = True
|
||||
|
||||
from .result import TestResult
|
||||
from .case import (TestCase, FunctionTestCase, SkipTest, skip, skipIf,
|
||||
- skipUnless, expectedFailure)
|
||||
+ skipUnless, expectedFailure,
|
||||
+ _skipInRpmBuild)
|
||||
from .suite import BaseTestSuite, TestSuite
|
||||
from .loader import (TestLoader, defaultTestLoader, makeSuite, getTestCaseNames,
|
||||
findTestCases)
|
||||
|
||||
@ -1,15 +0,0 @@
|
||||
diff -up Python-3.2.3/Lib/ctypes/__init__.py.rhbz814391 Python-3.2.3/Lib/ctypes/__init__.py
|
||||
--- Python-3.2.3/Lib/ctypes/__init__.py.rhbz814391 2012-04-20 15:12:49.017867692 -0400
|
||||
+++ Python-3.2.3/Lib/ctypes/__init__.py 2012-04-20 15:15:09.501111408 -0400
|
||||
@@ -275,11 +275,6 @@ def _reset_cache():
|
||||
# _SimpleCData.c_char_p_from_param
|
||||
POINTER(c_char).from_param = c_char_p.from_param
|
||||
_pointer_type_cache[None] = c_void_p
|
||||
- # XXX for whatever reasons, creating the first instance of a callback
|
||||
- # function is needed for the unittests on Win64 to succeed. This MAY
|
||||
- # be a compiler bug, since the problem occurs only when _ctypes is
|
||||
- # compiled with the MS SDK compiler. Or an uninitialized variable?
|
||||
- CFUNCTYPE(c_int)(lambda: None)
|
||||
|
||||
def create_unicode_buffer(init, size=None):
|
||||
"""create_unicode_buffer(aString) -> character array
|
||||
@ -1,311 +0,0 @@
|
||||
diff --git a/Include/object.h b/Include/object.h
|
||||
index c772dea..5729797 100644
|
||||
--- a/Include/object.h
|
||||
+++ b/Include/object.h
|
||||
@@ -1098,6 +1098,49 @@ PyAPI_FUNC(void)
|
||||
_PyObject_DebugTypeStats(FILE *out);
|
||||
#endif /* ifndef Py_LIMITED_API */
|
||||
|
||||
+/*
|
||||
+ Define a pair of assertion macros.
|
||||
+
|
||||
+ These work like the regular C assert(), in that they will abort the
|
||||
+ process with a message on stderr if the given condition fails to hold,
|
||||
+ but compile away to nothing if NDEBUG is defined.
|
||||
+
|
||||
+ However, before aborting, Python will also try to call _PyObject_Dump() on
|
||||
+ the given object. This may be of use when investigating bugs in which a
|
||||
+ particular object is corrupt (e.g. buggy a tp_visit method in an extension
|
||||
+ module breaking the garbage collector), to help locate the broken objects.
|
||||
+
|
||||
+ The WITH_MSG variant allows you to supply an additional message that Python
|
||||
+ will attempt to print to stderr, after the object dump.
|
||||
+*/
|
||||
+#ifdef NDEBUG
|
||||
+/* No debugging: compile away the assertions: */
|
||||
+#define PyObject_ASSERT_WITH_MSG(obj, expr, msg) ((void)0)
|
||||
+#else
|
||||
+/* With debugging: generate checks: */
|
||||
+#define PyObject_ASSERT_WITH_MSG(obj, expr, msg) \
|
||||
+ ((expr) \
|
||||
+ ? (void)(0) \
|
||||
+ : _PyObject_AssertFailed((obj), \
|
||||
+ (msg), \
|
||||
+ (__STRING(expr)), \
|
||||
+ (__FILE__), \
|
||||
+ (__LINE__), \
|
||||
+ (__PRETTY_FUNCTION__)))
|
||||
+#endif
|
||||
+
|
||||
+#define PyObject_ASSERT(obj, expr) \
|
||||
+ PyObject_ASSERT_WITH_MSG(obj, expr, NULL)
|
||||
+
|
||||
+/*
|
||||
+ Declare and define the entrypoint even when NDEBUG is defined, to avoid
|
||||
+ causing compiler/linker errors when building extensions without NDEBUG
|
||||
+ against a Python built with NDEBUG defined
|
||||
+*/
|
||||
+PyAPI_FUNC(void) _PyObject_AssertFailed(PyObject *, const char *,
|
||||
+ const char *, const char *, int,
|
||||
+ const char *);
|
||||
+
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
diff --git a/Lib/test/test_gc.py b/Lib/test/test_gc.py
|
||||
index 8d806db..dc8bb16 100644
|
||||
--- a/Lib/test/test_gc.py
|
||||
+++ b/Lib/test/test_gc.py
|
||||
@@ -1,10 +1,12 @@
|
||||
import unittest
|
||||
from test.support import (verbose, refcount_test, run_unittest,
|
||||
strip_python_stderr, cpython_only, start_threads,
|
||||
- temp_dir, requires_type_collecting, TESTFN, unlink)
|
||||
+ temp_dir, requires_type_collecting, TESTFN, unlink,
|
||||
+ import_module)
|
||||
from test.support.script_helper import assert_python_ok, make_script
|
||||
|
||||
import sys
|
||||
+import sysconfig
|
||||
import time
|
||||
import gc
|
||||
import weakref
|
||||
@@ -46,6 +48,8 @@ class GC_Detector(object):
|
||||
# gc collects it.
|
||||
self.wr = weakref.ref(C1055820(666), it_happened)
|
||||
|
||||
+BUILD_WITH_NDEBUG = ('-DNDEBUG' in sysconfig.get_config_vars()['PY_CFLAGS'])
|
||||
+
|
||||
@with_tp_del
|
||||
class Uncollectable(object):
|
||||
"""Create a reference cycle with multiple __del__ methods.
|
||||
@@ -878,6 +882,50 @@ class GCCallbackTests(unittest.TestCase):
|
||||
self.assertEqual(len(gc.garbage), 0)
|
||||
|
||||
|
||||
+ @unittest.skipIf(BUILD_WITH_NDEBUG,
|
||||
+ 'built with -NDEBUG')
|
||||
+ def test_refcount_errors(self):
|
||||
+ self.preclean()
|
||||
+ # Verify the "handling" of objects with broken refcounts
|
||||
+ import_module("ctypes") #skip if not supported
|
||||
+
|
||||
+ import subprocess
|
||||
+ code = '''if 1:
|
||||
+ a = []
|
||||
+ b = [a]
|
||||
+
|
||||
+ # Simulate the refcount of "a" being too low (compared to the
|
||||
+ # references held on it by live data), but keeping it above zero
|
||||
+ # (to avoid deallocating it):
|
||||
+ import ctypes
|
||||
+ ctypes.pythonapi.Py_DecRef(ctypes.py_object(a))
|
||||
+
|
||||
+ # The garbage collector should now have a fatal error when it reaches
|
||||
+ # the broken object:
|
||||
+ import gc
|
||||
+ gc.collect()
|
||||
+ '''
|
||||
+ p = subprocess.Popen([sys.executable, "-c", code],
|
||||
+ stdout=subprocess.PIPE,
|
||||
+ stderr=subprocess.PIPE)
|
||||
+ stdout, stderr = p.communicate()
|
||||
+ p.stdout.close()
|
||||
+ p.stderr.close()
|
||||
+ # Verify that stderr has a useful error message:
|
||||
+ self.assertRegex(stderr,
|
||||
+ b'Modules/gcmodule.c:[0-9]+: visit_decref: Assertion "\(\(gc\)->gc.gc_refs >> \(1\)\) != 0" failed.')
|
||||
+ self.assertRegex(stderr,
|
||||
+ b'refcount was too small')
|
||||
+ self.assertRegex(stderr,
|
||||
+ b'object : \[\]')
|
||||
+ self.assertRegex(stderr,
|
||||
+ b'type : list')
|
||||
+ self.assertRegex(stderr,
|
||||
+ b'refcount: 1')
|
||||
+ self.assertRegex(stderr,
|
||||
+ b'address : 0x[0-9a-f]+')
|
||||
+
|
||||
+
|
||||
class GCTogglingTests(unittest.TestCase):
|
||||
def setUp(self):
|
||||
gc.enable()
|
||||
diff --git a/Modules/gcmodule.c b/Modules/gcmodule.c
|
||||
index 4d701cb..388dd78 100644
|
||||
--- a/Modules/gcmodule.c
|
||||
+++ b/Modules/gcmodule.c
|
||||
@@ -239,7 +239,8 @@ update_refs(PyGC_Head *containers)
|
||||
{
|
||||
PyGC_Head *gc = containers->gc.gc_next;
|
||||
for (; gc != containers; gc = gc->gc.gc_next) {
|
||||
- assert(_PyGCHead_REFS(gc) == GC_REACHABLE);
|
||||
+ PyObject_ASSERT(FROM_GC(gc),
|
||||
+ _PyGCHead_REFS(gc) == GC_REACHABLE);
|
||||
_PyGCHead_SET_REFS(gc, 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
|
||||
@@ -259,7 +260,8 @@ update_refs(PyGC_Head *containers)
|
||||
* so serious that maybe this should be a release-build
|
||||
* check instead of an assert?
|
||||
*/
|
||||
- assert(_PyGCHead_REFS(gc) != 0);
|
||||
+ PyObject_ASSERT(FROM_GC(gc),
|
||||
+ _PyGCHead_REFS(gc) != 0);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -274,7 +276,9 @@ visit_decref(PyObject *op, void *data)
|
||||
* generation being collected, which can be recognized
|
||||
* because only they have positive gc_refs.
|
||||
*/
|
||||
- assert(_PyGCHead_REFS(gc) != 0); /* else refcount was too small */
|
||||
+ PyObject_ASSERT_WITH_MSG(FROM_GC(gc),
|
||||
+ _PyGCHead_REFS(gc) != 0,
|
||||
+ "refcount was too small"); /* else refcount was too small */
|
||||
if (_PyGCHead_REFS(gc) > 0)
|
||||
_PyGCHead_DECREF(gc);
|
||||
}
|
||||
@@ -334,9 +338,10 @@ visit_reachable(PyObject *op, PyGC_Head *reachable)
|
||||
* If gc_refs == GC_UNTRACKED, it must be ignored.
|
||||
*/
|
||||
else {
|
||||
- assert(gc_refs > 0
|
||||
- || gc_refs == GC_REACHABLE
|
||||
- || gc_refs == GC_UNTRACKED);
|
||||
+ PyObject_ASSERT(FROM_GC(gc),
|
||||
+ gc_refs > 0
|
||||
+ || gc_refs == GC_REACHABLE
|
||||
+ || gc_refs == GC_UNTRACKED);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
@@ -378,7 +383,7 @@ move_unreachable(PyGC_Head *young, PyGC_Head *unreachable)
|
||||
*/
|
||||
PyObject *op = FROM_GC(gc);
|
||||
traverseproc traverse = Py_TYPE(op)->tp_traverse;
|
||||
- assert(_PyGCHead_REFS(gc) > 0);
|
||||
+ PyObject_ASSERT(op, _PyGCHead_REFS(gc) > 0);
|
||||
_PyGCHead_SET_REFS(gc, GC_REACHABLE);
|
||||
(void) traverse(op,
|
||||
(visitproc)visit_reachable,
|
||||
@@ -441,7 +446,7 @@ move_legacy_finalizers(PyGC_Head *unreachable, PyGC_Head *finalizers)
|
||||
for (gc = unreachable->gc.gc_next; gc != unreachable; gc = next) {
|
||||
PyObject *op = FROM_GC(gc);
|
||||
|
||||
- assert(IS_TENTATIVELY_UNREACHABLE(op));
|
||||
+ PyObject_ASSERT(op, IS_TENTATIVELY_UNREACHABLE(op));
|
||||
next = gc->gc.gc_next;
|
||||
|
||||
if (has_legacy_finalizer(op)) {
|
||||
@@ -517,7 +522,7 @@ handle_weakrefs(PyGC_Head *unreachable, PyGC_Head *old)
|
||||
PyWeakReference **wrlist;
|
||||
|
||||
op = FROM_GC(gc);
|
||||
- assert(IS_TENTATIVELY_UNREACHABLE(op));
|
||||
+ PyObject_ASSERT(op, IS_TENTATIVELY_UNREACHABLE(op));
|
||||
next = gc->gc.gc_next;
|
||||
|
||||
if (! PyType_SUPPORTS_WEAKREFS(Py_TYPE(op)))
|
||||
@@ -538,9 +543,9 @@ handle_weakrefs(PyGC_Head *unreachable, PyGC_Head *old)
|
||||
* the callback pointer intact. Obscure: it also
|
||||
* changes *wrlist.
|
||||
*/
|
||||
- assert(wr->wr_object == op);
|
||||
+ PyObject_ASSERT(wr->wr_object, wr->wr_object == op);
|
||||
_PyWeakref_ClearRef(wr);
|
||||
- assert(wr->wr_object == Py_None);
|
||||
+ PyObject_ASSERT(wr->wr_object, wr->wr_object == Py_None);
|
||||
if (wr->wr_callback == NULL)
|
||||
continue; /* no callback */
|
||||
|
||||
@@ -574,7 +579,7 @@ handle_weakrefs(PyGC_Head *unreachable, PyGC_Head *old)
|
||||
*/
|
||||
if (IS_TENTATIVELY_UNREACHABLE(wr))
|
||||
continue;
|
||||
- assert(IS_REACHABLE(wr));
|
||||
+ PyObject_ASSERT(op, IS_REACHABLE(wr));
|
||||
|
||||
/* Create a new reference so that wr can't go away
|
||||
* before we can process it again.
|
||||
@@ -583,7 +588,8 @@ handle_weakrefs(PyGC_Head *unreachable, PyGC_Head *old)
|
||||
|
||||
/* Move wr to wrcb_to_call, for the next pass. */
|
||||
wrasgc = AS_GC(wr);
|
||||
- assert(wrasgc != next); /* wrasgc is reachable, but
|
||||
+ PyObject_ASSERT(op, wrasgc != next);
|
||||
+ /* wrasgc is reachable, but
|
||||
next isn't, so they can't
|
||||
be the same */
|
||||
gc_list_move(wrasgc, &wrcb_to_call);
|
||||
@@ -599,11 +605,11 @@ handle_weakrefs(PyGC_Head *unreachable, PyGC_Head *old)
|
||||
|
||||
gc = wrcb_to_call.gc.gc_next;
|
||||
op = FROM_GC(gc);
|
||||
- assert(IS_REACHABLE(op));
|
||||
- assert(PyWeakref_Check(op));
|
||||
+ PyObject_ASSERT(op, IS_REACHABLE(op));
|
||||
+ PyObject_ASSERT(op, PyWeakref_Check(op));
|
||||
wr = (PyWeakReference *)op;
|
||||
callback = wr->wr_callback;
|
||||
- assert(callback != NULL);
|
||||
+ PyObject_ASSERT(op, callback != NULL);
|
||||
|
||||
/* copy-paste of weakrefobject.c's handle_callback() */
|
||||
temp = PyObject_CallFunctionObjArgs(callback, wr, NULL);
|
||||
@@ -717,12 +723,14 @@ check_garbage(PyGC_Head *collectable)
|
||||
for (gc = collectable->gc.gc_next; gc != collectable;
|
||||
gc = gc->gc.gc_next) {
|
||||
_PyGCHead_SET_REFS(gc, Py_REFCNT(FROM_GC(gc)));
|
||||
- assert(_PyGCHead_REFS(gc) != 0);
|
||||
+ PyObject_ASSERT(FROM_GC(gc),
|
||||
+ _PyGCHead_REFS(gc) != 0);
|
||||
}
|
||||
subtract_refs(collectable);
|
||||
for (gc = collectable->gc.gc_next; gc != collectable;
|
||||
gc = gc->gc.gc_next) {
|
||||
- assert(_PyGCHead_REFS(gc) >= 0);
|
||||
+ PyObject_ASSERT(FROM_GC(gc),
|
||||
+ _PyGCHead_REFS(gc) >= 0);
|
||||
if (_PyGCHead_REFS(gc) != 0)
|
||||
return -1;
|
||||
}
|
||||
diff --git a/Objects/object.c b/Objects/object.c
|
||||
index 220aa90..f6c7161 100644
|
||||
--- a/Objects/object.c
|
||||
+++ b/Objects/object.c
|
||||
@@ -2177,6 +2177,35 @@ _PyTrash_thread_destroy_chain(void)
|
||||
--tstate->trash_delete_nesting;
|
||||
}
|
||||
|
||||
+PyAPI_FUNC(void)
|
||||
+_PyObject_AssertFailed(PyObject *obj, const char *msg, const char *expr,
|
||||
+ const char *file, int line, const char *function)
|
||||
+{
|
||||
+ fprintf(stderr,
|
||||
+ "%s:%d: %s: Assertion \"%s\" failed.\n",
|
||||
+ file, line, function, expr);
|
||||
+ if (msg) {
|
||||
+ fprintf(stderr, "%s\n", msg);
|
||||
+ }
|
||||
+
|
||||
+ fflush(stderr);
|
||||
+
|
||||
+ if (obj) {
|
||||
+ /* This might succeed or fail, but we're about to abort, so at least
|
||||
+ try to provide any extra info we can: */
|
||||
+ _PyObject_Dump(obj);
|
||||
+ }
|
||||
+ else {
|
||||
+ fprintf(stderr, "NULL object\n");
|
||||
+ }
|
||||
+
|
||||
+ fflush(stdout);
|
||||
+ fflush(stderr);
|
||||
+
|
||||
+ /* Terminate the process: */
|
||||
+ abort();
|
||||
+}
|
||||
+
|
||||
#ifndef Py_TRACE_REFS
|
||||
/* For Py_LIMITED_API, we need an out-of-line version of _Py_Dealloc.
|
||||
Define this here, so we can undefine the macro. */
|
||||
@ -2,29 +2,34 @@ diff --git a/Lib/ensurepip/__init__.py b/Lib/ensurepip/__init__.py
|
||||
index 4748ba4..fc02255 100644
|
||||
--- a/Lib/ensurepip/__init__.py
|
||||
+++ b/Lib/ensurepip/__init__.py
|
||||
@@ -1,16 +1,27 @@
|
||||
@@ -1,6 +1,7 @@
|
||||
+import distutils.version
|
||||
+import glob
|
||||
import os
|
||||
import os.path
|
||||
-import pkgutil
|
||||
import sys
|
||||
import runpy
|
||||
import tempfile
|
||||
|
||||
@@ -8,10 +9,24 @@ import tempfile
|
||||
|
||||
__all__ = ["version", "bootstrap"]
|
||||
|
||||
+_WHEEL_DIR = "/usr/share/python-wheels/"
|
||||
|
||||
-_SETUPTOOLS_VERSION = "40.8.0"
|
||||
-_SETUPTOOLS_VERSION = "41.2.0"
|
||||
+_wheels = {}
|
||||
|
||||
-_PIP_VERSION = "19.0.3"
|
||||
-_PIP_VERSION = "19.2.3"
|
||||
+def _get_most_recent_wheel_version(pkg):
|
||||
+ prefix = os.path.join(_WHEEL_DIR, "{}-".format(pkg))
|
||||
+ suffix = "-py2.py3-none-any.whl"
|
||||
+ _wheels[pkg] = {}
|
||||
+ for suffix in "-py2.py3-none-any.whl", "-py3-none-any.whl":
|
||||
+ pattern = "{}*{}".format(prefix, suffix)
|
||||
+ versions = (p[len(prefix):-len(suffix)] for p in glob.glob(pattern))
|
||||
+ return str(max(versions, key=distutils.version.LooseVersion))
|
||||
+ for path in glob.glob(pattern):
|
||||
+ version_str = path[len(prefix):-len(suffix)]
|
||||
+ _wheels[pkg][version_str] = os.path.basename(path)
|
||||
+ return str(max(_wheels[pkg], key=distutils.version.LooseVersion))
|
||||
+
|
||||
+
|
||||
+_SETUPTOOLS_VERSION = _get_most_recent_wheel_version("setuptools")
|
||||
@ -33,16 +38,18 @@ index 4748ba4..fc02255 100644
|
||||
|
||||
_PROJECTS = [
|
||||
("setuptools", _SETUPTOOLS_VERSION),
|
||||
@@ -94,12 +105,9 @@ def _bootstrap(*, root=None, upgrade=False, user=False,
|
||||
@@ -105,13 +120,10 @@ def _bootstrap(*, root=None, upgrade=False, user=False,
|
||||
# additional paths that need added to sys.path
|
||||
additional_paths = []
|
||||
for project, version in _PROJECTS:
|
||||
wheel_name = "{}-{}-py2.py3-none-any.whl".format(project, version)
|
||||
- wheel_name = "{}-{}-py2.py3-none-any.whl".format(project, version)
|
||||
- whl = pkgutil.get_data(
|
||||
- "ensurepip",
|
||||
- "_bundled/{}".format(wheel_name),
|
||||
- )
|
||||
- with open(os.path.join(tmpdir, wheel_name), "wb") as fp:
|
||||
- fp.write(whl)
|
||||
+ wheel_name = _wheels[project][version]
|
||||
+ with open(os.path.join(_WHEEL_DIR, wheel_name), "rb") as sfp:
|
||||
+ with open(os.path.join(tmpdir, wheel_name), "wb") as fp:
|
||||
+ fp.write(sfp.read())
|
||||
|
||||
@ -1,13 +0,0 @@
|
||||
diff --git a/Lib/distutils/command/bdist_wininst.py b/Lib/distutils/command/bdist_wininst.py
|
||||
index 0871a4f..8796b68 100644
|
||||
--- a/Lib/distutils/command/bdist_wininst.py
|
||||
+++ b/Lib/distutils/command/bdist_wininst.py
|
||||
@@ -12,6 +12,8 @@ from distutils.sysconfig import get_python_version
|
||||
from distutils import log
|
||||
|
||||
class bdist_wininst(Command):
|
||||
+ # Marker for tests that we have the unsupported bdist_wininst
|
||||
+ _unsupported = True
|
||||
|
||||
description = "create an executable installer for MS Windows"
|
||||
|
||||
@ -1,133 +0,0 @@
|
||||
From e170d5de8a7e8561388d38007195b5edf5f1fc82 Mon Sep 17 00:00:00 2001
|
||||
From: "Miss Islington (bot)"
|
||||
<31488909+miss-islington@users.noreply.github.com>
|
||||
Date: Fri, 9 Aug 2019 01:30:33 -0700
|
||||
Subject: [PATCH] bpo-34155: Dont parse domains containing @ (GH-13079)
|
||||
|
||||
Before:
|
||||
|
||||
>>> email.message_from_string('From: a@malicious.org@important.com', policy=email.policy.default)['from'].addresses
|
||||
(Address(display_name='', username='a', domain='malicious.org'),)
|
||||
|
||||
>>> parseaddr('a@malicious.org@important.com')
|
||||
('', 'a@malicious.org')
|
||||
|
||||
After:
|
||||
|
||||
>>> email.message_from_string('From: a@malicious.org@important.com', policy=email.policy.default)['from'].addresses
|
||||
(Address(display_name='', username='', domain=''),)
|
||||
|
||||
>>> parseaddr('a@malicious.org@important.com')
|
||||
('', 'a@')
|
||||
|
||||
https://bugs.python.org/issue34155
|
||||
(cherry picked from commit 8cb65d1381b027f0b09ee36bfed7f35bb4dec9a9)
|
||||
|
||||
Co-authored-by: jpic <jpic@users.noreply.github.com>
|
||||
Signed-off-by: hehuazhen <hehuazhen@huawei.com>
|
||||
---
|
||||
Lib/email/_header_value_parser.py | 2 ++
|
||||
Lib/email/_parseaddr.py | 11 ++++++++++-
|
||||
Lib/test/test_email/test__header_value_parser.py | 10 ++++++++++
|
||||
Lib/test/test_email/test_email.py | 14 ++++++++++++++
|
||||
.../next/Security/2019-05-04-13-33-37.bpo-34155.MJll68.rst | 1 +
|
||||
5 files changed, 37 insertions(+), 1 deletion(-)
|
||||
create mode 100644 Misc/NEWS.d/next/Security/2019-05-04-13-33-37.bpo-34155.MJll68.rst
|
||||
|
||||
diff --git a/Lib/email/_header_value_parser.py b/Lib/email/_header_value_parser.py
|
||||
index fc00b4a..bbc026e 100644
|
||||
--- a/Lib/email/_header_value_parser.py
|
||||
+++ b/Lib/email/_header_value_parser.py
|
||||
@@ -1582,6 +1582,8 @@ def get_domain(value):
|
||||
token, value = get_dot_atom(value)
|
||||
except errors.HeaderParseError:
|
||||
token, value = get_atom(value)
|
||||
+ if value and value[0] == '@':
|
||||
+ raise errors.HeaderParseError('Invalid Domain')
|
||||
if leader is not None:
|
||||
token[:0] = [leader]
|
||||
domain.append(token)
|
||||
diff --git a/Lib/email/_parseaddr.py b/Lib/email/_parseaddr.py
|
||||
index cdfa372..41ff6f8 100644
|
||||
--- a/Lib/email/_parseaddr.py
|
||||
+++ b/Lib/email/_parseaddr.py
|
||||
@@ -379,7 +379,12 @@ class AddrlistClass:
|
||||
aslist.append('@')
|
||||
self.pos += 1
|
||||
self.gotonext()
|
||||
- return EMPTYSTRING.join(aslist) + self.getdomain()
|
||||
+ domain = self.getdomain()
|
||||
+ if not domain:
|
||||
+ # Invalid domain, return an empty address instead of returning a
|
||||
+ # local part to denote failed parsing.
|
||||
+ return EMPTYSTRING
|
||||
+ return EMPTYSTRING.join(aslist) + domain
|
||||
|
||||
def getdomain(self):
|
||||
"""Get the complete domain name from an address."""
|
||||
@@ -394,6 +399,10 @@ class AddrlistClass:
|
||||
elif self.field[self.pos] == '.':
|
||||
self.pos += 1
|
||||
sdlist.append('.')
|
||||
+ elif self.field[self.pos] == '@':
|
||||
+ # bpo-34155: Don't parse domains with two `@` like
|
||||
+ # `a@malicious.org@important.com`.
|
||||
+ return EMPTYSTRING
|
||||
elif self.field[self.pos] in self.atomends:
|
||||
break
|
||||
else:
|
||||
diff --git a/Lib/test/test_email/test__header_value_parser.py b/Lib/test/test_email/test__header_value_parser.py
|
||||
index 693487b..7dc4de1 100644
|
||||
--- a/Lib/test/test_email/test__header_value_parser.py
|
||||
+++ b/Lib/test/test_email/test__header_value_parser.py
|
||||
@@ -1438,6 +1438,16 @@ class TestParser(TestParserMixin, TestEmailBase):
|
||||
self.assertEqual(addr_spec.domain, 'example.com')
|
||||
self.assertEqual(addr_spec.addr_spec, 'star.a.star@example.com')
|
||||
|
||||
+ def test_get_addr_spec_multiple_domains(self):
|
||||
+ with self.assertRaises(errors.HeaderParseError):
|
||||
+ parser.get_addr_spec('star@a.star@example.com')
|
||||
+
|
||||
+ with self.assertRaises(errors.HeaderParseError):
|
||||
+ parser.get_addr_spec('star@a@example.com')
|
||||
+
|
||||
+ with self.assertRaises(errors.HeaderParseError):
|
||||
+ parser.get_addr_spec('star@172.17.0.1@example.com')
|
||||
+
|
||||
# get_obs_route
|
||||
|
||||
def test_get_obs_route_simple(self):
|
||||
diff --git a/Lib/test/test_email/test_email.py b/Lib/test/test_email/test_email.py
|
||||
index c29cc56..aa77588 100644
|
||||
--- a/Lib/test/test_email/test_email.py
|
||||
+++ b/Lib/test/test_email/test_email.py
|
||||
@@ -3041,6 +3041,20 @@ class TestMiscellaneous(TestEmailBase):
|
||||
self.assertEqual(utils.parseaddr('<>'), ('', ''))
|
||||
self.assertEqual(utils.formataddr(utils.parseaddr('<>')), '')
|
||||
|
||||
+ def test_parseaddr_multiple_domains(self):
|
||||
+ self.assertEqual(
|
||||
+ utils.parseaddr('a@b@c'),
|
||||
+ ('', '')
|
||||
+ )
|
||||
+ self.assertEqual(
|
||||
+ utils.parseaddr('a@b.c@c'),
|
||||
+ ('', '')
|
||||
+ )
|
||||
+ self.assertEqual(
|
||||
+ utils.parseaddr('a@172.17.0.1@c'),
|
||||
+ ('', '')
|
||||
+ )
|
||||
+
|
||||
def test_noquote_dump(self):
|
||||
self.assertEqual(
|
||||
utils.formataddr(('A Silly Person', 'person@dom.ain')),
|
||||
diff --git a/Misc/NEWS.d/next/Security/2019-05-04-13-33-37.bpo-34155.MJll68.rst b/Misc/NEWS.d/next/Security/2019-05-04-13-33-37.bpo-34155.MJll68.rst
|
||||
new file mode 100644
|
||||
index 0000000..50292e2
|
||||
--- /dev/null
|
||||
+++ b/Misc/NEWS.d/next/Security/2019-05-04-13-33-37.bpo-34155.MJll68.rst
|
||||
@@ -0,0 +1 @@
|
||||
+Fix parsing of invalid email addresses with more than one ``@`` (e.g. a@b@c.com.) to not return the part before 2nd ``@`` as valid email address. Patch by maxking & jpic.
|
||||
--
|
||||
1.8.3.1
|
||||
@ -1,79 +0,0 @@
|
||||
From 0fe421c4875a031a83b4f0d804464af3a613985c Mon Sep 17 00:00:00 2001
|
||||
From: Dong-hee Na <donghee.na92@gmail.com>
|
||||
Date: Sat, 28 Sep 2019 04:59:37 +0900
|
||||
Subject: [PATCH] bpo-38243, xmlrpc.server: Escape the server_title (GH-16373)
|
||||
|
||||
Escape the server title of xmlrpc.server.DocXMLRPCServer
|
||||
when rendering the document page as HTML.
|
||||
---
|
||||
Lib/test/test_docxmlrpc.py | 16 ++++++++++++++++
|
||||
Lib/xmlrpc/server.py | 3 ++-
|
||||
.../Security/2019-09-25-13-21-09.bpo-38243.1pfz24.rst | 3 +++
|
||||
3 files changed, 21 insertions(+), 1 deletion(-)
|
||||
create mode 100644 Misc/NEWS.d/next/Security/2019-09-25-13-21-09.bpo-38243.1pfz24.rst
|
||||
|
||||
diff --git a/Lib/test/test_docxmlrpc.py b/Lib/test/test_docxmlrpc.py
|
||||
index f077f05..3821565 100644
|
||||
--- a/Lib/test/test_docxmlrpc.py
|
||||
+++ b/Lib/test/test_docxmlrpc.py
|
||||
@@ -1,5 +1,6 @@
|
||||
from xmlrpc.server import DocXMLRPCServer
|
||||
import http.client
|
||||
+import re
|
||||
import sys
|
||||
import threading
|
||||
from test import support
|
||||
@@ -193,6 +194,21 @@ class DocXMLRPCHTTPGETServer(unittest.TestCase):
|
||||
b'method_annotation</strong></a>(x: bytes)</dt></dl>'),
|
||||
response.read())
|
||||
|
||||
+ def test_server_title_escape(self):
|
||||
+ # bpo-38243: Ensure that the server title and documentation
|
||||
+ # are escaped for HTML.
|
||||
+ self.serv.set_server_title('test_title<script>')
|
||||
+ self.serv.set_server_documentation('test_documentation<script>')
|
||||
+ self.assertEqual('test_title<script>', self.serv.server_title)
|
||||
+ self.assertEqual('test_documentation<script>',
|
||||
+ self.serv.server_documentation)
|
||||
+
|
||||
+ generated = self.serv.generate_html_documentation()
|
||||
+ title = re.search(r'<title>(.+?)</title>', generated).group()
|
||||
+ documentation = re.search(r'<p><tt>(.+?)</tt></p>', generated).group()
|
||||
+ self.assertEqual('<title>Python: test_title<script></title>', title)
|
||||
+ self.assertEqual('<p><tt>test_documentation<script></tt></p>', documentation)
|
||||
+
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
diff --git a/Lib/xmlrpc/server.py b/Lib/xmlrpc/server.py
|
||||
index f1c467e..32aba4d 100644
|
||||
--- a/Lib/xmlrpc/server.py
|
||||
+++ b/Lib/xmlrpc/server.py
|
||||
@@ -108,6 +108,7 @@ from xmlrpc.client import Fault, dumps, loads, gzip_encode, gzip_decode
|
||||
from http.server import BaseHTTPRequestHandler
|
||||
from functools import partial
|
||||
from inspect import signature
|
||||
+import html
|
||||
import http.server
|
||||
import socketserver
|
||||
import sys
|
||||
@@ -894,7 +895,7 @@ class XMLRPCDocGenerator:
|
||||
methods
|
||||
)
|
||||
|
||||
- return documenter.page(self.server_title, documentation)
|
||||
+ return documenter.page(html.escape(self.server_title), documentation)
|
||||
|
||||
class DocXMLRPCRequestHandler(SimpleXMLRPCRequestHandler):
|
||||
"""XML-RPC and documentation request handler class.
|
||||
diff --git a/Misc/NEWS.d/next/Security/2019-09-25-13-21-09.bpo-38243.1pfz24.rst b/Misc/NEWS.d/next/Security/2019-09-25-13-21-09.bpo-38243.1pfz24.rst
|
||||
new file mode 100644
|
||||
index 0000000..98d7be1
|
||||
--- /dev/null
|
||||
+++ b/Misc/NEWS.d/next/Security/2019-09-25-13-21-09.bpo-38243.1pfz24.rst
|
||||
@@ -0,0 +1,3 @@
|
||||
+Escape the server title of :class:`xmlrpc.server.DocXMLRPCServer`
|
||||
+when rendering the document page as HTML.
|
||||
+(Contributed by Dong-hee Na in :issue:`38243`.)
|
||||
--
|
||||
1.8.3.1
|
||||
@ -1,27 +0,0 @@
|
||||
From c7dac45bbe3ea5fe11df60b07f03c822de350284 Mon Sep 17 00:00:00 2001
|
||||
From: Elena Oat <oat.elena@gmail.com>
|
||||
Date: Sun, 4 Nov 2018 06:50:55 -0800
|
||||
Subject: [PATCH] Explain that the orderness of the result of glob is
|
||||
system-dependant (GH-6587)
|
||||
|
||||
Thanks!
|
||||
---
|
||||
Doc/library/glob.rst | 3 ++-
|
||||
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/Doc/library/glob.rst b/Doc/library/glob.rst
|
||||
index 0db10b5..2a5f0dd 100644
|
||||
--- a/Doc/library/glob.rst
|
||||
+++ b/Doc/library/glob.rst
|
||||
@@ -42,7 +42,8 @@ For example, ``'[?]'`` matches the character ``'?'``.
|
||||
a string containing a path specification. *pathname* can be either absolute
|
||||
(like :file:`/usr/src/Python-1.5/Makefile`) or relative (like
|
||||
:file:`../../Tools/\*/\*.gif`), and can contain shell-style wildcards. Broken
|
||||
- symlinks are included in the results (as in the shell).
|
||||
+ symlinks are included in the results (as in the shell). Whether or not the
|
||||
+ results are sorted depends on the file system.
|
||||
|
||||
.. index::
|
||||
single: **; in glob-style wildcards
|
||||
--
|
||||
1.8.3.1
|
||||
@ -1,89 +0,0 @@
|
||||
From 7c1b25f7c1e9381fa4b96b4fc489e4bbbe065f02 Mon Sep 17 00:00:00 2001
|
||||
From: JunWei Song <sungboss2004@gmail.com>
|
||||
Date: Wed, 11 Sep 2019 23:04:12 +0800
|
||||
Subject: [PATCH] bpo-36260: Add pitfalls to zipfile module documentation
|
||||
(#13378)
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
* bpo-36260: Add pitfalls to zipfile module documentation
|
||||
|
||||
We saw vulnerability warning description (including zip bomb) in Doc/library/xml.rst file.
|
||||
This gave us the idea of documentation improvement.
|
||||
|
||||
So, we moved a little bit forward :P
|
||||
And the doc patch can be found (pr).
|
||||
|
||||
* fix trailing whitespace
|
||||
|
||||
* 📜 🤖 Added by blurb_it.
|
||||
|
||||
* Reformat text for consistency.
|
||||
|
||||
---
|
||||
Doc/library/zipfile.rst | 40 +++++++++++++++++++
|
||||
.../2019-06-04-09-29-00.bpo-36260.WrGuc-.rst | 1 +
|
||||
2 files changed, 41 insertions(+)
|
||||
create mode 100644 Misc/NEWS.d/next/Documentation/2019-06-04-09-29-00.bpo-36260.WrGuc-.rst
|
||||
|
||||
diff --git a/Doc/library/zipfile.rst b/Doc/library/zipfile.rst
|
||||
index 6fb03a0..6fa0a28 100644
|
||||
--- a/Doc/library/zipfile.rst
|
||||
+++ b/Doc/library/zipfile.rst
|
||||
@@ -730,5 +730,45 @@ Command-line options
|
||||
|
||||
Test whether the zipfile is valid or not.
|
||||
|
||||
+Decompression pitfalls
|
||||
+----------------------
|
||||
+
|
||||
+The extraction in zipfile module might fail due to some pitfalls listed below.
|
||||
+
|
||||
+From file itself
|
||||
+~~~~~~~~~~~~~~~~
|
||||
+
|
||||
+Decompression may fail due to incorrect password / CRC checksum / ZIP format or
|
||||
+unsupported compression method / decryption.
|
||||
+
|
||||
+File System limitations
|
||||
+~~~~~~~~~~~~~~~~~~~~~~~
|
||||
+
|
||||
+Exceeding limitations on different file systems can cause decompression failed.
|
||||
+Such as allowable characters in the directory entries, length of the file name,
|
||||
+length of the pathname, size of a single file, and number of files, etc.
|
||||
+
|
||||
+Resources limitations
|
||||
+~~~~~~~~~~~~~~~~~~~~~
|
||||
+
|
||||
+The lack of memory or disk volume would lead to decompression
|
||||
+failed. For example, decompression bombs (aka `ZIP bomb`_)
|
||||
+apply to zipfile library that can cause disk volume exhaustion.
|
||||
+
|
||||
+Interruption
|
||||
+~~~~~~~~~~~~
|
||||
+
|
||||
+Interruption during the decompression, such as pressing control-C or killing the
|
||||
+decompression process may result in incomplete decompression of the archive.
|
||||
+
|
||||
+Default behaviors of extraction
|
||||
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
+
|
||||
+Not knowing the default extraction behaviors
|
||||
+can cause unexpected decompression results.
|
||||
+For example, when extracting the same archive twice,
|
||||
+it overwrites files without asking.
|
||||
+
|
||||
|
||||
+.. _ZIP bomb: https://en.wikipedia.org/wiki/Zip_bomb
|
||||
.. _PKZIP Application Note: https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT
|
||||
diff --git a/Misc/NEWS.d/next/Documentation/2019-06-04-09-29-00.bpo-36260.WrGuc-.rst b/Misc/NEWS.d/next/Documentation/2019-06-04-09-29-00.bpo-36260.WrGuc-.rst
|
||||
new file mode 100644
|
||||
index 0000000..9276516
|
||||
--- /dev/null
|
||||
+++ b/Misc/NEWS.d/next/Documentation/2019-06-04-09-29-00.bpo-36260.WrGuc-.rst
|
||||
@@ -0,0 +1 @@
|
||||
+Add decompression pitfalls to zipfile module documentation.
|
||||
\ No newline at end of file
|
||||
--
|
||||
2.23.0
|
||||
Binary file not shown.
@ -1,24 +0,0 @@
|
||||
diff --git a/Lib/platform.py b/Lib/platform.py
|
||||
index 6ab06b5..8d41a4b 100755
|
||||
--- a/Lib/platform.py
|
||||
+++ b/Lib/platform.py
|
||||
@@ -297,7 +297,7 @@ _release_version = re.compile(r'([^0-9]+)'
|
||||
# and http://www.die.net/doc/linux/man/man1/lsb_release.1.html
|
||||
|
||||
_supported_dists = (
|
||||
- 'SuSE', 'debian', 'fedora', 'redhat', 'centos',
|
||||
+ 'SuSE', 'debian', 'fedora', 'redhat', 'centos', 'generic_os',
|
||||
'mandrake', 'mandriva', 'rocks', 'slackware', 'yellowdog', 'gentoo',
|
||||
'UnitedLinux', 'turbolinux', 'arch', 'mageia')
|
||||
|
||||
@@ -367,6 +367,8 @@ def _linux_distribution(distname, version, id, supported_dists,
|
||||
return distname, version, id
|
||||
etc.sort()
|
||||
for file in etc:
|
||||
+ if os.path.islink(os.path.join(_UNIXCONFDIR, file)):
|
||||
+ continue
|
||||
m = _release_filename.match(file)
|
||||
if m is not None:
|
||||
_distname, dummy = m.groups()
|
||||
--
|
||||
2.23.0
|
||||
84
python3.spec
84
python3.spec
@ -2,12 +2,12 @@ Name: python3
|
||||
Summary: Interpreter of the Python3 programming language
|
||||
URL: https://www.python.org/
|
||||
|
||||
Version: 3.7.4
|
||||
Release: 11
|
||||
Version: 3.8.3
|
||||
Release: 1
|
||||
License: Python
|
||||
|
||||
%global branchversion 3.7
|
||||
%global pyshortver 37
|
||||
%global branchversion 3.8
|
||||
%global pyshortver 38
|
||||
|
||||
%ifarch %{ix86} x86_64
|
||||
%bcond_without optimizations
|
||||
@ -18,15 +18,11 @@ License: Python
|
||||
%global pylibdir %{_libdir}/python%{branchversion}
|
||||
%global dynload_dir %{pylibdir}/lib-dynload
|
||||
|
||||
# See http://www.python.org/dev/peps/pep-3149/
|
||||
%global ABIFLAGS_optimized m
|
||||
%global ABIFLAGS_debug dm
|
||||
%global LDVERSION_optimized %{branchversion}
|
||||
%global LDVERSION_debug %{branchversion}d
|
||||
|
||||
%global LDVERSION_optimized %{branchversion}m
|
||||
%global LDVERSION_debug %{branchversion}dm
|
||||
|
||||
%global SOABI_optimized cpython-%{pyshortver}m-%{_arch}-linux%{_gnu}
|
||||
%global SOABI_debug cpython-%{pyshortver}dm-%{_arch}-linux%{_gnu}
|
||||
%global SOABI_optimized cpython-%{pyshortver}-%{_arch}-linux%{_gnu}
|
||||
%global SOABI_debug cpython-%{pyshortver}d-%{_arch}-linux%{_gnu}
|
||||
|
||||
# See http://www.python.org/dev/peps/pep-3147/
|
||||
%global bytecode_suffixes .cpython-%{pyshortver}*.pyc
|
||||
@ -92,21 +88,11 @@ Patch1: 00001-rpath.patch
|
||||
Patch102: 00102-lib64.patch
|
||||
Patch111: 00111-no-static-lib.patch
|
||||
Patch132: 00132-add-rpmbuild-hooks-to-unittest.patch
|
||||
Patch155: 00155-avoid-ctypes-thunks.patch
|
||||
Patch160: 00160-disable-test_fs_holes-in-rpm-build.patch
|
||||
Patch170: 00170-gc-assertions.patch
|
||||
Patch178: 00178-dont-duplicate-flags-in-sysconfig.patch
|
||||
Patch189: 00189-use-rpm-wheels.patch
|
||||
Patch205: 00205-make-libpl-respect-lib64.patch
|
||||
Patch251: 00251-change-user-install-location.patch
|
||||
Patch316: 00316-mark-bdist_wininst-unsupported.patch
|
||||
|
||||
Patch6000: CVE-2019-16056.patch
|
||||
Patch6001: CVE-2019-16935.patch
|
||||
Patch6002: CVE-2019-17514.patch
|
||||
Patch6003: CVE-2019-9674.patch
|
||||
|
||||
Patch9000: python3-add-generic-os-support.patch
|
||||
|
||||
Provides: python%{branchversion} = %{version}-%{release}
|
||||
Provides: python(abi) = %{branchversion}
|
||||
@ -191,25 +177,14 @@ rm -r Modules/expat
|
||||
%patch102 -p1
|
||||
%patch111 -p1
|
||||
%patch132 -p1
|
||||
%patch155 -p1
|
||||
%patch160 -p1
|
||||
%patch170 -p1
|
||||
%patch178 -p1
|
||||
|
||||
%patch189 -p1
|
||||
rm Lib/ensurepip/_bundled/*.whl
|
||||
%patch205 -p1
|
||||
%patch251 -p1
|
||||
%patch316 -p1
|
||||
|
||||
%patch6000 -p1
|
||||
%patch6001 -p1
|
||||
%patch6002 -p1
|
||||
%patch6003 -p1
|
||||
|
||||
%patch9000 -p1
|
||||
|
||||
sed -i "s/generic_os/%{_vendor}/g" Lib/platform.py
|
||||
rm configure pyconfig.h.in
|
||||
|
||||
%build
|
||||
@ -227,7 +202,7 @@ topdir=$(pwd)
|
||||
%global extension_cflags ""
|
||||
%global extension_ldflags ""
|
||||
|
||||
export CFLAGS="%{extension_cflags} -D_GNU_SOURCE -fPIC -fwrapv"
|
||||
export CFLAGS="%{extension_cflags} -D_GNU_SOURCE -fPIC -fwrapv -fstack-protector-strong"
|
||||
export CFLAGS_NODIST="%{build_cflags} -D_GNU_SOURCE -fPIC -fwrapv"
|
||||
export CXXFLAGS="%{extension_cxxflags} -D_GNU_SOURCE -fPIC -fwrapv"
|
||||
export CPPFLAGS="$(pkg-config --cflags-only-I libffi)"
|
||||
@ -392,6 +367,8 @@ ln -s %{_bindir}/python3 %{buildroot}%{_bindir}/python
|
||||
|
||||
mv %{buildroot}%{_bindir}/2to3-%{branchversion} %{buildroot}%{_bindir}/2to3
|
||||
|
||||
cp -a %{_libdir}/libpython3.7m.so.1.0 ${RPM_BUILD_ROOT}%{_libdir}
|
||||
|
||||
%check
|
||||
topdir=$(pwd)
|
||||
|
||||
@ -435,11 +412,8 @@ export BEP_GTDLIST="$BEP_GTDLIST_TMP"
|
||||
|
||||
%{_bindir}/pydoc*
|
||||
%{_bindir}/python3
|
||||
%{_bindir}/pyvenv
|
||||
|
||||
%{_bindir}/python%{branchversion}
|
||||
%{_bindir}/python%{branchversion}m
|
||||
%{_bindir}/pyvenv-%{branchversion}
|
||||
|
||||
%dir %{pylibdir}
|
||||
%dir %{dynload_dir}
|
||||
@ -548,6 +522,7 @@ export BEP_GTDLIST="$BEP_GTDLIST_TMP"
|
||||
%{dynload_dir}/nis.%{SOABI_optimized}.so
|
||||
%{dynload_dir}/ossaudiodev.%{SOABI_optimized}.so
|
||||
%{dynload_dir}/parser.%{SOABI_optimized}.so
|
||||
%{dynload_dir}/_posixshmem.%{SOABI_optimized}.so
|
||||
%{dynload_dir}/pyexpat.%{SOABI_optimized}.so
|
||||
%{dynload_dir}/readline.%{SOABI_optimized}.so
|
||||
%{dynload_dir}/resource.%{SOABI_optimized}.so
|
||||
@ -560,6 +535,8 @@ export BEP_GTDLIST="$BEP_GTDLIST_TMP"
|
||||
%{dynload_dir}/_uuid.%{SOABI_optimized}.so
|
||||
%{dynload_dir}/xxlimited.%{SOABI_optimized}.so
|
||||
%{dynload_dir}/zlib.%{SOABI_optimized}.so
|
||||
%{dynload_dir}/_statistics.%{SOABI_optimized}.so
|
||||
%{dynload_dir}/_xxsubinterpreters.%{SOABI_optimized}.so
|
||||
|
||||
%dir %{pylibdir}/site-packages/
|
||||
%dir %{pylibdir}/site-packages/__pycache__/
|
||||
@ -640,6 +617,7 @@ export BEP_GTDLIST="$BEP_GTDLIST_TMP"
|
||||
|
||||
%{_libdir}/%{py_INSTSONAME_optimized}
|
||||
%{_libdir}/libpython3.so
|
||||
%{_libdir}/libpython3.7m.so.1.0
|
||||
|
||||
%files -n python3-unversioned-command
|
||||
%{_bindir}/python
|
||||
@ -652,10 +630,12 @@ export BEP_GTDLIST="$BEP_GTDLIST_TMP"
|
||||
%exclude %{_includedir}/python%{LDVERSION_optimized}/%{_pyconfig_h}
|
||||
%{_includedir}/python%{LDVERSION_optimized}/*.h
|
||||
%{_includedir}/python%{LDVERSION_optimized}/internal/
|
||||
%{_includedir}/python%{LDVERSION_optimized}/cpython/
|
||||
%doc Misc/README.valgrind Misc/valgrind-python.supp Misc/gdbinit
|
||||
|
||||
%{_bindir}/python3-config
|
||||
%{_libdir}/pkgconfig/python3.pc
|
||||
%{_libdir}/pkgconfig/python3-embed.pc
|
||||
%{_bindir}/pathfix.py
|
||||
%{_bindir}/pygettext3.py
|
||||
%{_bindir}/msgfmt3.py
|
||||
@ -663,12 +643,11 @@ export BEP_GTDLIST="$BEP_GTDLIST_TMP"
|
||||
%{_bindir}/pygettext%{branchversion}.py
|
||||
%{_bindir}/msgfmt%{branchversion}.py
|
||||
|
||||
%{_bindir}/python%{branchversion}-config
|
||||
%{_bindir}/python%{LDVERSION_optimized}-config
|
||||
%{_bindir}/python%{LDVERSION_optimized}-*-config
|
||||
%{_libdir}/libpython%{LDVERSION_optimized}.so
|
||||
%{_libdir}/pkgconfig/python-%{LDVERSION_optimized}.pc
|
||||
%{_libdir}/pkgconfig/python-%{branchversion}.pc
|
||||
%{_libdir}/pkgconfig/python-%{LDVERSION_optimized}-embed.pc
|
||||
|
||||
%{_bindir}/idle*
|
||||
%{pylibdir}/idlelib
|
||||
@ -690,22 +669,13 @@ export BEP_GTDLIST="$BEP_GTDLIST_TMP"
|
||||
%{pylibdir}/distutils/tests
|
||||
%{pylibdir}/sqlite3/test
|
||||
%{pylibdir}/test
|
||||
%exclude %{pylibdir}/test/allsans.pem
|
||||
%exclude %{pylibdir}/test/badcert.pem
|
||||
%exclude %{pylibdir}/test/badkey.pem
|
||||
%exclude %{pylibdir}/test/idnsans.pem
|
||||
%exclude %{pylibdir}/test/keycert2.pem
|
||||
%exclude %{pylibdir}/test/keycert3.pem
|
||||
%exclude %{pylibdir}/test/keycert4.pem
|
||||
%exclude %{pylibdir}/test/keycertecc.pem
|
||||
%exclude %{pylibdir}/test/keycert.pem
|
||||
%exclude %{pylibdir}/test/pycakey.pem
|
||||
%exclude %{pylibdir}/test/ssl_key.pem
|
||||
%exclude %{pylibdir}/test/keycert3.pem
|
||||
%exclude %{pylibdir}/test/ssl_key.pem
|
||||
%exclude %{pylibdir}/test/capath
|
||||
%exclude %{pylibdir}/test/*.pem
|
||||
%exclude %{pylibdir}/test/*.crl
|
||||
%{dynload_dir}/_ctypes_test.%{SOABI_optimized}.so
|
||||
%{dynload_dir}/_testbuffer.%{SOABI_optimized}.so
|
||||
%{dynload_dir}/_testcapi.%{SOABI_optimized}.so
|
||||
%{dynload_dir}/_testinternalcapi.%{SOABI_optimized}.so
|
||||
%{dynload_dir}/_testimportmultiple.%{SOABI_optimized}.so
|
||||
%{dynload_dir}/_xxtestfuzz.%{SOABI_optimized}.so
|
||||
%{pylibdir}/lib2to3/tests
|
||||
@ -789,6 +759,9 @@ export BEP_GTDLIST="$BEP_GTDLIST_TMP"
|
||||
%{dynload_dir}/_uuid.%{SOABI_debug}.so
|
||||
%{dynload_dir}/_xxtestfuzz.%{SOABI_debug}.so
|
||||
%{dynload_dir}/zlib.%{SOABI_debug}.so
|
||||
%{dynload_dir}/_statistics.%{SOABI_debug}.so
|
||||
%{dynload_dir}/_xxsubinterpreters.%{SOABI_debug}.so
|
||||
%{dynload_dir}/_posixshmem.%{SOABI_debug}.so
|
||||
|
||||
%{_libdir}/%{py_INSTSONAME_debug}
|
||||
|
||||
@ -799,6 +772,7 @@ export BEP_GTDLIST="$BEP_GTDLIST_TMP"
|
||||
%{_libdir}/libpython%{LDVERSION_debug}.so
|
||||
%{_libdir}/libpython%{LDVERSION_debug}.so.1.0
|
||||
%{_libdir}/pkgconfig/python-%{LDVERSION_debug}.pc
|
||||
%{_libdir}/pkgconfig/python-%{LDVERSION_debug}-embed.pc
|
||||
|
||||
%{dynload_dir}/_tkinter.%{SOABI_debug}.so
|
||||
|
||||
@ -806,6 +780,7 @@ export BEP_GTDLIST="$BEP_GTDLIST_TMP"
|
||||
%{dynload_dir}/_testbuffer.%{SOABI_debug}.so
|
||||
%{dynload_dir}/_testcapi.%{SOABI_debug}.so
|
||||
%{dynload_dir}/_testimportmultiple.%{SOABI_debug}.so
|
||||
%{dynload_dir}/_testinternalcapi.%{SOABI_debug}.so
|
||||
|
||||
%undefine _debuginfo_subpackages
|
||||
|
||||
@ -813,6 +788,9 @@ export BEP_GTDLIST="$BEP_GTDLIST_TMP"
|
||||
%{_mandir}/*/*
|
||||
|
||||
%changelog
|
||||
* Fri Jun 5 2020 hanxinke<hanxinke@huawei.com> - 3.8.3-1
|
||||
- Update to Python 3.8.3
|
||||
|
||||
* Tue Jun 2 2020 hanxinke<hanxinke@huawei.com> - 3.7.4-11
|
||||
- Type:bugfix
|
||||
- ID:NA
|
||||
@ -855,7 +833,7 @@ export BEP_GTDLIST="$BEP_GTDLIST_TMP"
|
||||
- SUG:NA
|
||||
- DESC:update spec file
|
||||
|
||||
* Thu Dec 24 2019 openEuler Buildteam <buildteam@openeuler.org> - 3.7.4-4
|
||||
* Tue Dec 24 2019 openEuler Buildteam <buildteam@openeuler.org> - 3.7.4-4
|
||||
- fix CVE-2019-16056 CVE-2019-16935 CVE-2019-17514
|
||||
- Delete the test keys, fix BEP problem
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user