diff --git a/Include/internal/pycore_interp_structs.h b/Include/internal/pycore_interp_structs.h index 573b56a57e1d54..9ac4b4630abd3f 100644 --- a/Include/internal/pycore_interp_structs.h +++ b/Include/internal/pycore_interp_structs.h @@ -754,6 +754,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/Python/pystate.c b/Python/pystate.c index ee35f0fa945f8b..aba558279a657d 100644 --- a/Python/pystate.c +++ b/Python/pystate.c @@ -569,11 +569,19 @@ _PyInterpreterState_Enable(_PyRuntimeState *runtime) return _PyStatus_OK(); } - static PyInterpreterState * alloc_interpreter(void) { - return PyMem_RawCalloc(1, sizeof(PyInterpreterState)); + size_t alignment = _Alignof(PyInterpreterState); + size_t allocsize = sizeof(PyInterpreterState) + alignment - 1; + void *mem = PyMem_RawCalloc(1, allocsize); + if (mem == NULL) { + return NULL; + } + PyInterpreterState *interp = _Py_ALIGN_UP(mem, alignment); + assert(_Py_IS_ALIGNED(interp, alignment)); + interp->_malloced = mem; + return interp; } static void @@ -587,12 +595,15 @@ free_interpreter(PyInterpreterState *interp) PyMem_RawFree(interp->obmalloc); interp->obmalloc = NULL; } - PyMem_RawFree(interp); + assert(_Py_IS_ALIGNED(interp, _Alignof(PyInterpreterState))); + PyMem_RawFree(interp->_malloced); } } + #ifndef NDEBUG static inline int check_interpreter_whence(long); #endif + /* Get the interpreter state to a minimal consistent state. Further init happens in pylifecycle.c before it can be used. All fields not initialized here are expected to be zeroed out, pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy