-
-
Notifications
You must be signed in to change notification settings - Fork 31.9k
gh-107080: Fix Py_TRACE_REFS Crashes Under Isolated Subinterpreters #107567
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
gh-107080: Fix Py_TRACE_REFS Crashes Under Isolated Subinterpreters #107567
Conversation
Python/pylifecycle.c
Outdated
} | ||
|
||
PyObject refchain = { 0 }; | ||
_Py_StealRefchain(tstate->interp, &refchain); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why is this necessary?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The interpreter will be deallocated before we later call _Py_PrintReferenceAddresses()
to walk the linked list.
That said, I think there's a related problem that I still need to address. Namely, every remaining object in the linked list will be (effectively) freed when the interpreter's allocator is finalized, so the _ob_next
and _ob_prev
accesses might segfault. It likely isn't a big problem during runtime finalization (except perhaps for embedders) but I'll fix that regardless.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Hmm, I'm pretty sure that's not actually a problem. We only call _Py_PrintReferenceAddresses()
in Py_FinalizeEx()
and only for the main interpreter, which is statically allocated. Objects in the linked list might still cause a segfault but only if they would have before this change, so I'm not going to worry about that here. I will leave a note in the code though.
Thanks @ericsnowcurrently for the PR 🌮🎉.. I'm working now to backport this PR to: 3.12. |
GH-107599 is a backport of this pull request to the 3.12 branch. |
…ters (pythongh-107567) The linked list of objects was a global variable, which broke isolation between interpreters, causing crashes. To solve this, we've moved the linked list to each interpreter. (cherry picked from commit 58ef741) Co-authored-by: Eric Snow <[email protected]>
…eters (gh-107567) (#107599) gh-107080: Fix Py_TRACE_REFS Crashes Under Isolated Subinterpreters (gh-107567) The linked list of objects was a global variable, which broke isolation between interpreters, causing crashes. To solve this, we've moved the linked list to each interpreter. (cherry picked from commit 58ef741) Co-authored-by: Eric Snow <[email protected]>
…ted Subinterpreters (pythongh-107567) (python#107599)" This reverts commit 58af229.
…lated Subinterpreters (pythongh-107567) (python#107599)". This reverts commit 6e4eec7 (pythongh-107648).
The linked list of objects was a global variable, which broke isolation between interpreters, causing crashes. To solve this, we've moved the linked list to each interpreter.