]> granicus.if.org Git - python/commitdiff
fix refleaks in PyDict_SetItem error cases (closes #27248)
authorBenjamin Peterson <benjamin@python.org>
Thu, 7 Jul 2016 06:26:32 +0000 (23:26 -0700)
committerBenjamin Peterson <benjamin@python.org>
Thu, 7 Jul 2016 06:26:32 +0000 (23:26 -0700)
Objects/typeobject.c

index 272a283b3e1adaba6d02831c562e7ed2c3948c85..438c70b45a15ed1061ae8ae1bc74e279d7970da7 100644 (file)
@@ -3693,8 +3693,10 @@ add_members(PyTypeObject *type, PyMemberDef *memb)
         descr = PyDescr_NewMember(type, memb);
         if (descr == NULL)
             return -1;
-        if (PyDict_SetItemString(dict, memb->name, descr) < 0)
+        if (PyDict_SetItemString(dict, memb->name, descr) < 0) {
+            Py_DECREF(descr);
             return -1;
+        }
         Py_DECREF(descr);
     }
     return 0;
@@ -3713,8 +3715,10 @@ add_getset(PyTypeObject *type, PyGetSetDef *gsp)
 
         if (descr == NULL)
             return -1;
-        if (PyDict_SetItemString(dict, gsp->name, descr) < 0)
+        if (PyDict_SetItemString(dict, gsp->name, descr) < 0) {
+            Py_DECREF(descr);
             return -1;
+        }
         Py_DECREF(descr);
     }
     return 0;
@@ -6498,8 +6502,10 @@ add_operators(PyTypeObject *type)
             descr = PyDescr_NewWrapper(type, p, *ptr);
             if (descr == NULL)
                 return -1;
-            if (PyDict_SetItem(dict, p->name_strobj, descr) < 0)
+            if (PyDict_SetItem(dict, p->name_strobj, descr) < 0) {
+                Py_DECREF(descr);
                 return -1;
+            }
             Py_DECREF(descr);
         }
     }