Skip to content

Do not allocate non-PyObjects with PyObject_Malloc() #114569

Closed
@colesbury

Description

@colesbury

Feature or enhancement

The free-threaded build requires that Python objects -- and only Python objects -- be allocated through the Python object allocation APIs (like PyObject_Malloc() or PyType_GenericNew()) 1.

There are a few places internally 2 that use PyObject_Malloc() for non Python objects. We should switch those call sites to use PyMem_Malloc()/Free() instead.

Note that there is not a significant difference between using PyObject_Malloc() and PyMem_Malloc() in the default build. Both calls use obmalloc under the hood, so switching from one to the other should not matter for the default build.

Here are some examples, but this list may not be exhaustive:

ctx->u.rep = (SRE_REPEAT*) PyObject_Malloc(sizeof(*ctx->u.rep));

self->extra = PyObject_Malloc(sizeof(ElementObjectExtra));

children = PyObject_Realloc(self->extra->children,
size * sizeof(PyObject*));

https://github.com/python/cpython/blob/main/Modules/mathmodule.c#L2573
static XML_Memory_Handling_Suite ExpatMemoryHandler = {
PyObject_Malloc, PyObject_Realloc, PyObject_Free};

new->ob_bytes = PyObject_Malloc(alloc);

char *result = (char *)PyObject_Malloc((input_length + 1) * sizeof(char));

Linked PRs

Footnotes

  1. See https://peps.python.org/pep-0703/#backwards-compatibility:~:text=Non%2DPython%20objects%20must%20not%20be%20allocated%20through%20those%20APIs

  2. @DinoV fixed the use in dictobject.c in https://github.com/python/cpython/pull/114543

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions