]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-127421: Fix race in test_start_new_thread_failed (#127549)
authormpage <mpage@meta.com>
Tue, 3 Dec 2024 17:50:58 +0000 (09:50 -0800)
committerGitHub <noreply@github.com>
Tue, 3 Dec 2024 17:50:58 +0000 (09:50 -0800)
Fix race in test_start_new_thread_failed

When we succeed in starting a new thread, for example if setrlimit
was ineffective, we must wait for the newly spawned thread to exit.
Otherwise, we run the risk that the newly spawned thread will race
with runtime finalization and access memory that has already been
clobbered/freed.

`_thread.start_new_thread()` only spawns daemon threads, which the runtime
does not wait for at shutdown, and does not return a handle. Use
`_thread.start_joinable_thread()` and join the resulting handle when
the thread is started successfully.

Lib/test/test_threading.py

index b666533466e57838f946301cf54a55b70b680d24..fe225558fc4f0b0fcb8938a0a3dc2650dc0f501a 100644 (file)
@@ -1192,11 +1192,12 @@ class ThreadTests(BaseTestCase):
             resource.setrlimit(resource.RLIMIT_NPROC, (0, hard))
 
             try:
-                _thread.start_new_thread(f, ())
+                handle = _thread.start_joinable_thread(f)
             except RuntimeError:
                 print('ok')
             else:
                 print('!skip!')
+                handle.join()
         """
         _, out, err = assert_python_ok("-u", "-c", code)
         out = out.strip()