aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/Python/gc_free_threading.c
diff options
context:
space:
mode:
authorSam Gross <colesbury@gmail.com>2025-02-13 11:50:45 -0500
committerGitHub <noreply@github.com>2025-02-13 11:50:45 -0500
commit0559339ccdc76a63dcbd14eb2d60a41f493a1ded (patch)
tree54a7ebae23ab23f91e42677bfa61d5c246081e35 /Python/gc_free_threading.c
parentc357d690033e2f976ddb6e11b8199e3fb9f66118 (diff)
downloadcpython-0559339ccdc76a63dcbd14eb2d60a41f493a1ded.tar.gz
cpython-0559339ccdc76a63dcbd14eb2d60a41f493a1ded.zip
gh-130019: Fix data race in _PyType_AllocNoTrack (gh-130058)
The reference count fields, such as `ob_tid` and `ob_ref_shared`, may be accessed concurrently in the free threading build by a `_Py_TryXGetRef` or similar operation. The PyObject header fields will be initialized by `_PyObject_Init`, so only call `memset()` to zero-initialize the remainder of the allocation.
Diffstat (limited to 'Python/gc_free_threading.c')
-rw-r--r--Python/gc_free_threading.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/Python/gc_free_threading.c b/Python/gc_free_threading.c
index 0d6fddb5705..694f97d5c57 100644
--- a/Python/gc_free_threading.c
+++ b/Python/gc_free_threading.c
@@ -2595,11 +2595,12 @@ PyObject *
PyUnstable_Object_GC_NewWithExtraData(PyTypeObject *tp, size_t extra_size)
{
size_t presize = _PyType_PreHeaderSize(tp);
- PyObject *op = gc_alloc(tp, _PyObject_SIZE(tp) + extra_size, presize);
+ size_t size = _PyObject_SIZE(tp) + extra_size;
+ PyObject *op = gc_alloc(tp, size, presize);
if (op == NULL) {
return NULL;
}
- memset(op, 0, _PyObject_SIZE(tp) + extra_size);
+ memset((char *)op + sizeof(PyObject), 0, size - sizeof(PyObject));
_PyObject_Init(op, tp);
return op;
}