| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
Sorry, something went wrong.
…n#109135) Fix _thread.start_new_thread() race condition. If a thread is created during Python finalization, the newly spawned thread now exits immediately instead of trying to access freed memory and lead to a crash. thread_run() calls PyEval_AcquireThread() which checks if the thread must exit. The problem was that tstate was dereferenced earlier in _PyThreadState_Bind() which leads to a crash most of the time. Move _PyThreadState_CheckConsistency() from thread_run() to _PyThreadState_Bind(). (cherry picked from commit 517cd82)
|
I tested manually this fix, it works as I expected. I used this test: #109135 (comment) Without this change: CRASH! (...) -- sleep 100 ms before PyEval_AcquireThread() -- -- sleep 100 ms before PyEval_AcquireThread() -- -- sleep 100 ms before PyEval_AcquireThread() -- -- sleep 100 ms before PyEval_AcquireThread() -- -- sleep 100 ms before PyEval_AcquireThread() -- -- sleep 100 ms before PyEval_AcquireThread() -- -- sleep 100 ms before PyEval_AcquireThread() -- exit -- sleep 1 sec after free_interpreter() -- python: Python/pystate.c:2259: _PyThreadState_CheckConsistency: Assertion `!_PyMem_IsPtrFreed(tstate->interp)' failed. python: Python/pystate.c:2259: _PyThreadState_CheckConsistency: Assertion `!_PyMem_IsPtrFreed(tstate->interp)' failed. python: Python/pystate.c:2259: _PyThreadState_CheckConsistency: Assertion `!_PyMem_IsPtrFreed(tstate->interp)' failed. python: Python/pystate.c:2259: _PyThreadState_CheckConsistency: Assertion `!_PyMem_IsPtrFreed(tstate->interp)' failed. Abandon (core dumped) With this change: not crash. $ ./python bug.py; echo "exitcode=$?" (...) -- sleep 100 ms before PyEval_AcquireThread() -- -- sleep 100 ms before PyEval_AcquireThread() -- -- sleep 100 ms before PyEval_AcquireThread() -- -- sleep 100 ms before PyEval_AcquireThread() -- -- sleep 100 ms before PyEval_AcquireThread() -- -- sleep 100 ms before PyEval_AcquireThread() -- -- sleep 100 ms before PyEval_AcquireThread() -- -- sleep 100 ms before PyEval_AcquireThread() -- exit -- sleep 1 sec after free_interpreter() -- exitcode=0 |
Sorry, something went wrong.
| Back | FazBrowse Home | New Git URL |
Fix _thread.start_new_thread() race condition. If a thread is created during Python finalization, the newly spawned thread now exits immediately instead of trying to access freed memory and lead to a crash.
thread_run() calls PyEval_AcquireThread() which checks if the thread must exit. The problem was that tstate was dereferenced earlier in _PyThreadState_Bind() which leads to a crash most of the time.
Move _PyThreadState_CheckConsistency() from thread_run() to _PyThreadState_Bind().
(cherry picked from commit 517cd82)