@@ -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