@@ -3216,7 +3216,6 @@ PyCData_AtAddress(ctypes_state *st, PyObject *type, void *buf)
32163216 return NULL ;
32173217 }
32183218 assert (CDataObject_Check (st , pd ));
3219- // XXX Use an atomic load if the size is 1, 2, 4, or 8 bytes?
32203219 pd -> b_ptr = (char * )buf ;
32213220 pd -> b_length = info -> length ;
32223221 pd -> b_size = info -> size ;
@@ -3242,15 +3241,23 @@ PyObject *
32423241PyCData_get (ctypes_state * st , PyObject * type , GETFUNC getfunc , PyObject * src ,
32433242 Py_ssize_t index , Py_ssize_t size , char * adr )
32443243{
3245- if (getfunc )
3246- return getfunc (adr , size );
3244+ CDataObject * cdata = (CDataObject * )src ;
3245+ if (getfunc ) {
3246+ LOCK_PTR (cdata );
3247+ PyObject * res = getfunc (adr , size );
3248+ UNLOCK_PTR (cdata );
3249+ return res ;
3250+ }
32473251 assert (type );
32483252 StgInfo * info ;
32493253 if (PyStgInfo_FromType (st , type , & info ) < 0 ) {
32503254 return NULL ;
32513255 }
32523256 if (info && info -> getfunc && !_ctypes_simple_instance (st , type )) {
3253- return info -> getfunc (adr , size );
3257+ LOCK_PTR (cdata );
3258+ PyObject * res = info -> getfunc (adr , size );
3259+ UNLOCK_PTR (cdata );
3260+ return res ;
32543261 }
32553262 return PyCData_FromBaseObj (st , type , src , index , adr );
32563263}
@@ -3267,15 +3274,22 @@ _PyCData_set(ctypes_state *st,
32673274 int err ;
32683275
32693276 if (setfunc ) {
3270- return setfunc (ptr , value , size );
3277+ LOCK_PTR (dst );
3278+ PyObject * res = setfunc (ptr , value , size );
3279+ UNLOCK_PTR (dst );
3280+ return res ;
32713281 }
32723282 if (!CDataObject_Check (st , value )) {
32733283 StgInfo * info ;
32743284 if (PyStgInfo_FromType (st , type , & info ) < 0 ) {
32753285 return NULL ;
32763286 }
3277- if (info && info -> setfunc )
3278- return info -> setfunc (ptr , value , size );
3287+ if (info && info -> setfunc ) {
3288+ LOCK_PTR (dst );
3289+ PyObject * res = info -> setfunc (ptr , value , size );
3290+ UNLOCK_PTR (dst );
3291+ return res ;
3292+ }
32793293 /*
32803294 If value is a tuple, we try to call the type with the tuple
32813295 and use the result!
@@ -3295,7 +3309,9 @@ _PyCData_set(ctypes_state *st,
32953309 Py_DECREF (ob );
32963310 return result ;
32973311 } else if (value == Py_None && PyCPointerTypeObject_Check (st , type )) {
3312+ LOCK_PTR (dst );
32983313 * (void * * )ptr = NULL ;
3314+ UNLOCK_PTR (dst );
32993315 Py_RETURN_NONE ;
33003316 } else {
33013317 PyErr_Format (PyExc_TypeError ,
@@ -3345,7 +3361,9 @@ _PyCData_set(ctypes_state *st,
33453361 ((PyTypeObject * )type )-> tp_name );
33463362 return NULL ;
33473363 }
3364+ LOCK_PTR (dst );
33483365 * (void * * )ptr = src -> b_ptr ;
3366+ UNLOCK_PTR (dst );
33493367
33503368 keep = GetKeepedObjects (src );
33513369 if (keep == NULL )
0 commit comments