@@ -217,13 +217,17 @@ MakeAnonFields(PyObject *type)
217217int
218218PyCStructUnionType_update_stginfo (PyObject * type , PyObject * fields , int isStruct )
219219{
220- PyObject * tmp ;
221220 Py_ssize_t ffi_ofs ;
222221 int arrays_seen = 0 ;
223222
224223 int retval = -1 ;
225224 // The following are NULL or hold strong references.
226225 // They're cleared on error.
226+ PyObject * layout_func = NULL ;
227+ PyObject * kwnames = NULL ;
228+ PyObject * align = NULL ;
229+ PyObject * size = NULL ;
230+ PyObject * layout_fields_obj = NULL ;
227231 PyObject * layout_fields = NULL ;
228232 PyObject * layout = NULL ;
229233 PyObject * format_spec_obj = NULL ;
@@ -257,12 +261,11 @@ PyCStructUnionType_update_stginfo(PyObject *type, PyObject *fields, int isStruct
257261 goto error ;
258262 }
259263
260- PyObject * layout_func = PyImport_ImportModuleAttrString ("ctypes._layout" ,
261- "get_layout" );
264+ layout_func = PyImport_ImportModuleAttrString ("ctypes._layout" , "get_layout" );
262265 if (!layout_func ) {
263266 goto error ;
264267 }
265- PyObject * kwnames = PyTuple_Pack (
268+ kwnames = PyTuple_Pack (
266269 2 ,
267270 & _Py_ID (is_struct ),
268271 & _Py_ID (base ));
@@ -281,19 +284,19 @@ PyCStructUnionType_update_stginfo(PyObject *type, PyObject *fields, int isStruct
281284 baseinfo ? base : Py_None },
282285 2 | PY_VECTORCALL_ARGUMENTS_OFFSET ,
283286 kwnames );
284- Py_DECREF (kwnames );
285- Py_DECREF (layout_func );
287+ Py_CLEAR (kwnames );
288+ Py_CLEAR (layout_func );
286289 fields = NULL ; // a borrowed reference we won't be using again
287290 if (!layout ) {
288291 goto error ;
289292 }
290293
291- tmp = PyObject_GetAttr (layout , & _Py_ID (align ));
292- if (!tmp ) {
294+ align = PyObject_GetAttr (layout , & _Py_ID (align ));
295+ if (!align ) {
293296 goto error ;
294297 }
295- Py_ssize_t total_align = PyLong_AsSsize_t (tmp );
296- Py_DECREF ( tmp );
298+ Py_ssize_t total_align = PyLong_AsSsize_t (align );
299+ Py_CLEAR ( align );
297300 if (total_align < 0 ) {
298301 if (!PyErr_Occurred ()) {
299302 PyErr_SetString (PyExc_ValueError ,
@@ -302,12 +305,12 @@ PyCStructUnionType_update_stginfo(PyObject *type, PyObject *fields, int isStruct
302305 goto error ;
303306 }
304307
305- tmp = PyObject_GetAttr (layout , & _Py_ID (size ));
306- if (!tmp ) {
308+ size = PyObject_GetAttr (layout , & _Py_ID (size ));
309+ if (!size ) {
307310 goto error ;
308311 }
309- Py_ssize_t total_size = PyLong_AsSsize_t (tmp );
310- Py_DECREF ( tmp );
312+ Py_ssize_t total_size = PyLong_AsSsize_t (size );
313+ Py_CLEAR ( size );
311314 if (total_size < 0 ) {
312315 if (!PyErr_Occurred ()) {
313316 PyErr_SetString (PyExc_ValueError ,
@@ -338,15 +341,15 @@ PyCStructUnionType_update_stginfo(PyObject *type, PyObject *fields, int isStruct
338341 }
339342 memcpy (stginfo -> format , format_spec , format_spec_size + 1 );
340343
341- PyObject * layout_fields_obj = PyObject_GetAttr (layout , & _Py_ID (fields ));
344+ layout_fields_obj = PyObject_GetAttr (layout , & _Py_ID (fields ));
342345 if (!layout_fields_obj ) {
343346 goto error ;
344347 }
345348 layout_fields = PySequence_Tuple (layout_fields_obj );
346- Py_DECREF (layout_fields_obj );
347349 if (!layout_fields ) {
348350 goto error ;
349351 }
352+ Py_CLEAR (layout_fields_obj );
350353 Py_CLEAR (layout );
351354
352355 Py_ssize_t len = PyTuple_GET_SIZE (layout_fields );
@@ -664,6 +667,11 @@ PyCStructUnionType_update_stginfo(PyObject *type, PyObject *fields, int isStruct
664667
665668 retval = MakeAnonFields (type );
666669error :
670+ Py_XDECREF (layout_func );
671+ Py_XDECREF (kwnames );
672+ Py_XDECREF (align );
673+ Py_XDECREF (size );
674+ Py_XDECREF (layout_fields_obj );
667675 Py_XDECREF (layout_fields );
668676 Py_XDECREF (layout );
669677 Py_XDECREF (format_spec_obj );
0 commit comments