mirror of
https://github.com/python/cpython.git
synced 2025-08-27 04:05:34 +00:00
Issue #14432: Remove the thread state field from the frame structure. Fix a
crash when a generator is created in a C thread that is destroyed while the generator is still used. The issue was that a generator contains a frame, and the frame kept a reference to the Python state of the destroyed C thread. The crash occurs when a trace function is setup.
This commit is contained in:
parent
62ca10051b
commit
fdeb6ec45a
8 changed files with 179 additions and 45 deletions
|
@ -662,6 +662,44 @@ class ThreadTests(BaseTestCase):
|
|||
self.assertRegex(err.rstrip(),
|
||||
b"^sys:1: ResourceWarning: unclosed file ")
|
||||
|
||||
def test_frame_tstate_tracing(self):
|
||||
# Issue #14432: Crash when a generator is created in a C thread that is
|
||||
# destroyed while the generator is still used. The issue was that a
|
||||
# generator contains a frame, and the frame kept a reference to the
|
||||
# Python state of the destroyed C thread. The crash occurs when a trace
|
||||
# function is setup.
|
||||
|
||||
def noop_trace(frame, event, arg):
|
||||
# no operation
|
||||
return noop_trace
|
||||
|
||||
def generator():
|
||||
while 1:
|
||||
yield "genereator"
|
||||
|
||||
def callback():
|
||||
if callback.gen is None:
|
||||
callback.gen = generator()
|
||||
return next(callback.gen)
|
||||
callback.gen = None
|
||||
|
||||
old_trace = sys.gettrace()
|
||||
sys.settrace(noop_trace)
|
||||
try:
|
||||
# Install a trace function
|
||||
threading.settrace(noop_trace)
|
||||
|
||||
# Create a generator in a C thread which exits after the call
|
||||
_testcapi.call_in_temporary_c_thread(callback)
|
||||
|
||||
# Call the generator in a different Python thread, check that the
|
||||
# generator didn't keep a reference to the destroyed thread state
|
||||
for test in range(3):
|
||||
# The trace function is still called here
|
||||
callback()
|
||||
finally:
|
||||
sys.settrace(old_trace)
|
||||
|
||||
|
||||
class ThreadJoinOnShutdown(BaseTestCase):
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue