Skip to content

Commit 70f9b3d

Browse files
gh-100926: fix thread safety of ctypes __pointer_type__ (#133843)
1 parent 53383e9 commit 70f9b3d

File tree

2 files changed

+73
-6
lines changed

2 files changed

+73
-6
lines changed

Modules/_ctypes/_ctypes.c

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -576,8 +576,16 @@ _ctypes_CType_Type___sizeof___impl(PyObject *self, PyTypeObject *cls)
576576
return PyLong_FromSsize_t(size);
577577
}
578578

579+
/*[clinic input]
580+
@getter
581+
@critical_section
582+
_ctypes.CType_Type.__pointer_type__
583+
584+
[clinic start generated code]*/
585+
579586
static PyObject *
580-
ctype_get_pointer_type(PyObject *self, void *Py_UNUSED(ignored))
587+
_ctypes_CType_Type___pointer_type___get_impl(PyObject *self)
588+
/*[clinic end generated code: output=718c9ff10b2b0012 input=ff7498aa6edf487c]*/
581589
{
582590
ctypes_state *st = get_module_state_by_def(Py_TYPE(self));
583591
StgInfo *info;
@@ -599,8 +607,16 @@ ctype_get_pointer_type(PyObject *self, void *Py_UNUSED(ignored))
599607
return NULL;
600608
}
601609

610+
/*[clinic input]
611+
@setter
612+
@critical_section
613+
_ctypes.CType_Type.__pointer_type__
614+
615+
[clinic start generated code]*/
616+
602617
static int
603-
ctype_set_pointer_type(PyObject *self, PyObject *tp, void *Py_UNUSED(ignored))
618+
_ctypes_CType_Type___pointer_type___set_impl(PyObject *self, PyObject *value)
619+
/*[clinic end generated code: output=6259be8ea21693fa input=9b2dc2400c388982]*/
604620
{
605621
ctypes_state *st = get_module_state_by_def(Py_TYPE(self));
606622
StgInfo *info;
@@ -612,7 +628,7 @@ ctype_set_pointer_type(PyObject *self, PyObject *tp, void *Py_UNUSED(ignored))
612628
return -1;
613629
}
614630

615-
Py_XSETREF(info->pointer_type, Py_XNewRef(tp));
631+
Py_XSETREF(info->pointer_type, Py_XNewRef(value));
616632
return 0;
617633
}
618634

@@ -626,8 +642,7 @@ static PyMethodDef ctype_methods[] = {
626642
};
627643

628644
static PyGetSetDef ctype_getsets[] = {
629-
{ "__pointer_type__", ctype_get_pointer_type, ctype_set_pointer_type,
630-
"pointer type", NULL },
645+
_CTYPES_CTYPE_TYPE___POINTER_TYPE___GETSETDEF
631646
{ NULL, NULL }
632647
};
633648

@@ -1254,9 +1269,11 @@ PyCPointerType_SetProto(ctypes_state *st, PyObject *self, StgInfo *stginfo, PyOb
12541269
return -1;
12551270
}
12561271
Py_XSETREF(stginfo->proto, Py_NewRef(proto));
1272+
STGINFO_LOCK(info);
12571273
if (info->pointer_type == NULL) {
12581274
Py_XSETREF(info->pointer_type, Py_NewRef(self));
12591275
}
1276+
STGINFO_UNLOCK();
12601277
return 0;
12611278
}
12621279

Modules/_ctypes/clinic/_ctypes.c.h

Lines changed: 51 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)