gh-127421: Fix race in test_start_new_thread_failed (#127549)

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.
This commit is contained in:
mpage 2024-12-03 09:50:58 -08:00 committed by GitHub
parent 0cb5222079
commit 13b68e1a61
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View 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()