Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 70f9b3d

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

File tree

Expand file treeCollapse file tree

2 files changed

+73
-6
lines changed
Filter options
Expand file treeCollapse file tree

2 files changed

+73
-6
lines changed

‎Modules/_ctypes/_ctypes.c

Copy file name to clipboardExpand all lines: Modules/_ctypes/_ctypes.c
+22-5Lines 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

Copy file name to clipboardExpand all lines: Modules/_ctypes/clinic/_ctypes.c.h
+51-1Lines 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 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.