diff --git a/SOURCES/00362-threading-enumerate-rlock.patch b/SOURCES/00362-threading-enumerate-rlock.patch new file mode 100644 index 0000000..9a8e064 --- /dev/null +++ b/SOURCES/00362-threading-enumerate-rlock.patch @@ -0,0 +1,36 @@ +bpo-44422: Fix threading.enumerate() reentrant call (GH-26727) + +The threading.enumerate() function now uses a reentrant lock to +prevent a hang on reentrant call. + +https://github.com/python/cpython/commit/243fd01047ddce1a7eb0f99a49732d123e942c63 + +Resolves: rhbz#1959459 + +diff --git a/Lib/threading.py b/Lib/threading.py +index 0ab1e46..7ab9ad8 100644 +--- a/Lib/threading.py ++++ b/Lib/threading.py +@@ -727,8 +727,11 @@ _counter() # Consume 0 so first non-main thread has id 1. + def _newname(template="Thread-%d"): + return template % _counter() + +-# Active thread administration +-_active_limbo_lock = _allocate_lock() ++# Active thread administration. ++# ++# bpo-44422: Use a reentrant lock to allow reentrant calls to functions like ++# threading.enumerate(). ++_active_limbo_lock = RLock() + _active = {} # maps thread id to Thread object + _limbo = {} + _dangling = WeakSet() +@@ -1325,7 +1328,7 @@ def _after_fork(): + # Reset _active_limbo_lock, in case we forked while the lock was held + # by another (non-forked) thread. http://bugs.python.org/issue874900 + global _active_limbo_lock, _main_thread +- _active_limbo_lock = _allocate_lock() ++ _active_limbo_lock = RLock() + + # fork() only copied the current thread; clear references to others. + new_active = {} diff --git a/SOURCES/00364-thread-exit.patch b/SOURCES/00364-thread-exit.patch new file mode 100644 index 0000000..b91665b --- /dev/null +++ b/SOURCES/00364-thread-exit.patch @@ -0,0 +1,43 @@ +bpo-44434: Don't call PyThread_exit_thread() explicitly (GH-26758) + +_thread.start_new_thread() no longer calls PyThread_exit_thread() +explicitly at the thread exit, the call was redundant. + +On Linux with the glibc, pthread_cancel() loads dynamically the +libgcc_s.so.1 library. dlopen() can fail if there is no more +available file descriptor to open the file. In this case, the process +aborts with the error message: + +"libgcc_s.so.1 must be installed for pthread_cancel to work" + +pthread_cancel() unwinds back to the thread's wrapping function that +calls the thread entry point. + +The unwind function is dynamically loaded from the libgcc_s library +since it is tightly coupled to the C compiler (GCC). The unwinder +depends on DWARF, the compiler generates DWARF, so the unwinder +belongs to the compiler. + +Thanks Florian Weimer and Carlos O'Donell for their help on +investigating this issue. + +https://github.com/python/cpython/commit/45a78f906d2d5fe5381d78466b11763fc56d57ba + +Resolves: rhbz#1972293 + +diff --git a/Modules/_threadmodule.c b/Modules/_threadmodule.c +index a13b2e0..8cc035b 100644 +--- a/Modules/_threadmodule.c ++++ b/Modules/_threadmodule.c +@@ -1027,7 +1027,10 @@ t_bootstrap(void *boot_raw) + nb_threads--; + PyThreadState_Clear(tstate); + PyThreadState_DeleteCurrent(); +- PyThread_exit_thread(); ++ ++ // bpo-44434: Don't call explicitly PyThread_exit_thread(). On Linux with ++ // the glibc, pthread_exit() can abort the whole process if dlopen() fails ++ // to open the libgcc_s.so library (ex: EMFILE error). + } + + static PyObject * diff --git a/SPECS/python3.spec b/SPECS/python3.spec index c2e843b..2b7dfa0 100644 --- a/SPECS/python3.spec +++ b/SPECS/python3.spec @@ -14,7 +14,7 @@ URL: https://www.python.org/ # WARNING When rebasing to a new Python version, # remember to update the python3-docs package as well Version: %{pybasever}.8 -Release: 38%{?dist} +Release: 39%{?dist} License: Python @@ -597,6 +597,19 @@ Patch359: 00359-CVE-2021-23336.patch # Main BZ: https://bugzilla.redhat.com/show_bug.cgi?id=1935913 Patch360: 00360-CVE-2021-3426.patch +# 00362 # +# The threading.enumerate() function now uses a reentrant lock to +# prevent a hang on reentrant call. +# Upstream: https://bugs.python.org/issue44422 +# Main BZ: https://bugzilla.redhat.com/show_bug.cgi?id=1959459 +Patch362: 00362-threading-enumerate-rlock.patch + +# 00364 # +# Don't call PyThread_exit_thread() explicitly. +# Upstream: https://bugs.python.org/issue44434 +# Main BZ: https://bugzilla.redhat.com/show_bug.cgi?id=1972293 +Patch364: 00364-thread-exit.patch + # (New patches go here ^^^) # # When adding new patches to "python" and "python3" in Fedora, EL, etc., @@ -925,6 +938,8 @@ git apply %{PATCH351} %patch357 -p1 %patch359 -p1 %patch360 -p1 +%patch362 -p1 +%patch364 -p1 # Remove files that should be generated by the build # (This is after patching, so that we can use patches directly from upstream) @@ -1850,6 +1865,11 @@ fi # ====================================================== %changelog +* Fri Jul 09 2021 Victor Stinner - 3.6.8-39 +- Fix reentrant call to threading.enumerate() (rhbz#1959459) +- Don't exit Python with abort() when a thread exit and there is no available + file descriptor to load dynamically the libgcc_s.so.1 library (rhbz#1972293) + * Fri Apr 30 2021 Charalampos Stratakis - 3.6.8-38 - Security fix for CVE-2021-3426: information disclosure via pydoc Resolves: rhbz#1935913