https://github.com/python/cpython/commit/0bcb1c25f7ba254bea9b744c7c5423cfebade3b3
commit: 0bcb1c25f7ba254bea9b744c7c5423cfebade3b3
branch: main
author: Peter Bierma <[email protected]>
committer: kumaraditya303 <[email protected]>
date: 2025-10-15T07:16:43+05:30
summary:
Revert "gh-140067: Fix memory leak in sub-interpreter creation (#140111)"
(#140140)
This reverts commit 59547a251f7069dc6e08cb6082dd21872671e381.
files:
D
Misc/NEWS.d/next/Core_and_Builtins/2025-10-14-17-07-37.gh-issue-140067.ID2gOm.rst
M Include/internal/pycore_interp_structs.h
M Python/pystate.c
diff --git a/Include/internal/pycore_interp_structs.h
b/Include/internal/pycore_interp_structs.h
index badc97808c6132..2124e76514f1af 100644
--- a/Include/internal/pycore_interp_structs.h
+++ b/Include/internal/pycore_interp_structs.h
@@ -769,6 +769,12 @@ struct _is {
* and should be placed at the beginning. */
struct _ceval_state ceval;
+ /* This structure is carefully allocated so that it's correctly aligned
+ * to avoid undefined behaviors during LOAD and STORE. The '_malloced'
+ * field stores the allocated pointer address that will later be freed.
+ */
+ void *_malloced;
+
PyInterpreterState *next;
int64_t id;
diff --git
a/Misc/NEWS.d/next/Core_and_Builtins/2025-10-14-17-07-37.gh-issue-140067.ID2gOm.rst
b/Misc/NEWS.d/next/Core_and_Builtins/2025-10-14-17-07-37.gh-issue-140067.ID2gOm.rst
deleted file mode 100644
index 3c5a828101d9a8..00000000000000
---
a/Misc/NEWS.d/next/Core_and_Builtins/2025-10-14-17-07-37.gh-issue-140067.ID2gOm.rst
+++ /dev/null
@@ -1 +0,0 @@
-Fix memory leak in sub-interpreter creation.
diff --git a/Python/pystate.c b/Python/pystate.c
index bf6e4e56e6df87..dbed609f29aa07 100644
--- a/Python/pystate.c
+++ b/Python/pystate.c
@@ -457,19 +457,16 @@ _PyInterpreterState_Enable(_PyRuntimeState *runtime)
static PyInterpreterState *
alloc_interpreter(void)
{
- // Aligned allocation for PyInterpreterState.
- // the first word of the memory block is used to store
- // the original pointer to be used later to free the memory.
size_t alignment = _Alignof(PyInterpreterState);
- size_t allocsize = sizeof(PyInterpreterState) + sizeof(void *) + alignment
- 1;
+ size_t allocsize = sizeof(PyInterpreterState) + alignment - 1;
void *mem = PyMem_RawCalloc(1, allocsize);
if (mem == NULL) {
return NULL;
}
- void *ptr = _Py_ALIGN_UP((char *)mem + sizeof(void *), alignment);
- ((void **)ptr)[-1] = mem;
- assert(_Py_IS_ALIGNED(ptr, alignment));
- return ptr;
+ PyInterpreterState *interp = _Py_ALIGN_UP(mem, alignment);
+ assert(_Py_IS_ALIGNED(interp, alignment));
+ interp->_malloced = mem;
+ return interp;
}
static void
@@ -484,7 +481,7 @@ free_interpreter(PyInterpreterState *interp)
interp->obmalloc = NULL;
}
assert(_Py_IS_ALIGNED(interp, _Alignof(PyInterpreterState)));
- PyMem_RawFree(((void **)interp)[-1]);
+ PyMem_RawFree(interp->_malloced);
}
}
_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3//lists/python-checkins.python.org
Member address: [email protected]