Cross-interpreter memory leak in _xidata_release when originating interpreter is destroyed
Chưa có ai nhận issue này.
- Ngôn ngữ chính
- Python
- Star
- 77.2k
- Fork
- 35.9k
- Chỉ số merge pull request
- Chỉ số pull request đang chờ
Mô tả
Bug report
Bug description:
Bug report
Bug summary
There is a known memory leak in Python/crossinterp.c related to the teardown of sub-interpreters when they share data.
When a sub-interpreter packages data into _PyXIData_t and passes it to a receiving interpreter, the receiver is expected to call _PyXIData_Release to free it. However, if the originating interpreter is destroyed before the receiver calls release, the original interpreter's memory context is lost.
In _xidata_release (Python/crossinterp.c around line 1049), the code correctly identifies this state:
PyInterpreterState *interp = _PyInterpreterState_LookUpID(
_PyXIData_INTERPID(xidata));
if (interp == NULL) {
// The interpreter was already destroyed.
// This function shouldn't have been called.
// XXX Someone leaked some memory...
Because the originating interpreter is gone, Python intentionally leaks xidata->obj to avoid a use-after-free segfault.
Proposed Solution Architecture
To resolve this without crashing, we would need to track cross-interpreter data at the interpreter level:
- Modify
PyInterpreterStateto include a thread-safe registry tracking all active_PyXIData_tinstances created by that interpreter. - Register instances during
_PyCode_GetXIDataand deregister them during_xidata_release. - Modify
Py_EndInterpreterteardown to check this registry. If outstanding shared data exists, the shutting-down interpreter must either block until it is released, or forcefully invalidate/free the shared data (using anis_invalidatedflag) before tearing down its ownobmallocstate.
I'm opening this issue to get feedback on the proposed architecture before starting a Pull Request.
CPython versions tested on:
main branch
CPython versions tested on:
CPython main branch
Operating systems tested on:
Windows
Linked PRs
- gh-153745
Hướng dẫn đóng góp
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Hướng nghiên cứu
Bắt đầu với Python/crossinterp.c quanh _xidata_release, sau đó lần theo _PyCode_GetXIData và đường dẫn teardown của Py_EndInterpreter. Hãy xem xét công việc được liên kết gh-153745 trước khi tiếp tục, vì issue này yêu cầu phản hồi về kiến trúc và không xác định một triển khai cố định hay một bài kiểm tra hoàn tất.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Đánh giá
- Công nghệ
- c, python
- Lĩnh vực
- backend
- Loại issue
- Lỗi
- Độ khó
- 5/5
- Thời gian dự kiến
- Hơn một tuần
- Mức độ hoạt động
- Đình trệ
- Độ rõ ràng
- Cần làm rõ
- Mức phù hợp với người mới
- 25/100