diff -r 3d726dbfca31 Modules/_ctypes/_ctypes.c --- a/Modules/_ctypes/_ctypes.c Wed Jun 15 17:16:16 2016 -0500 +++ b/Modules/_ctypes/_ctypes.c Thu Jun 16 10:24:09 2016 +0300 @@ -1252,8 +1252,10 @@ add_methods(PyTypeObject *type, PyMethod descr = PyDescr_NewMethod(type, meth); if (descr == NULL) return -1; - if (PyDict_SetItemString(dict,meth->ml_name, descr) < 0) + if (PyDict_SetItemString(dict, meth->ml_name, descr) < 0) { + Py_DECREF(descr); return -1; + } Py_DECREF(descr); } return 0; @@ -1268,8 +1270,10 @@ add_members(PyTypeObject *type, PyMember 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; @@ -1285,8 +1289,10 @@ add_getset(PyTypeObject *type, PyGetSetD descr = PyDescr_NewGetSet(type, 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; @@ -1778,6 +1784,7 @@ static PyObject *CreateSwappedType(PyTyp newname = PyUnicode_Concat(name, suffix); if (newname == NULL) { + Py_DECREF(swapped_args); return NULL; } @@ -1797,8 +1804,10 @@ static PyObject *CreateSwappedType(PyTyp stgdict = (StgDictObject *)PyObject_CallObject( (PyObject *)&PyCStgDict_Type, NULL); - if (!stgdict) /* XXX leaks result! */ + if (!stgdict) { + Py_DECREF(result); return NULL; + } stgdict->ffi_type_pointer = *fmt->pffi_type; stgdict->align = fmt->pffi_type->alignment; @@ -1978,8 +1987,10 @@ PyCSimpleType_new(PyTypeObject *type, Py PyObject *meth; int x; meth = PyDescr_NewClassMethod(result, ml); - if (!meth) + if (!meth) { + Py_DECREF(result); return NULL; + } x = PyDict_SetItemString(result->tp_dict, ml->ml_name, meth); @@ -2159,8 +2170,10 @@ converters_from_argtypes(PyObject *ob) nArgs = PyTuple_GET_SIZE(ob); converters = PyTuple_New(nArgs); - if (!converters) + if (!converters) { + Py_DECREF(ob); return NULL; + } /* I have to check if this is correct. Using c_char, which has a size of 1, will be assumed to be pushed as only one byte! @@ -2212,7 +2225,7 @@ make_funcptrtype_dict(StgDictObject *stg if (ob) { converters = converters_from_argtypes(ob); if (!converters) - goto error; + return -1; Py_INCREF(ob); stgdict->argtypes = ob; stgdict->converters = converters; @@ -2244,11 +2257,6 @@ make_funcptrtype_dict(StgDictObject *stg } */ return 0; - - error: - Py_XDECREF(converters); - return -1; - } static PyCArgObject * diff -r 3d726dbfca31 Modules/_ctypes/callproc.c --- a/Modules/_ctypes/callproc.c Wed Jun 15 17:16:16 2016 -0500 +++ b/Modules/_ctypes/callproc.c Thu Jun 16 10:24:09 2016 +0300 @@ -157,8 +157,10 @@ PyObject * return NULL; memset(space, 0, sizeof(int) * 2); errobj = PyCapsule_New(space, CTYPES_CAPSULE_NAME_PYMEM, pymem_destructor); - if (errobj == NULL) + if (errobj == NULL) { + PyMem_Free(space); return NULL; + } if (-1 == PyDict_SetItem(dict, error_object_name, errobj)) { Py_DECREF(errobj); @@ -1319,10 +1321,7 @@ static PyObject *py_dl_open(PyObject *se if (name != Py_None) { if (PyUnicode_FSConverter(name, &name2) == 0) return NULL; - if (PyBytes_Check(name2)) - name_str = PyBytes_AS_STRING(name2); - else - name_str = PyByteArray_AS_STRING(name2); + name_str = PyBytes_AS_STRING(name2); } else { name_str = NULL; name2 = NULL; @@ -1681,6 +1680,10 @@ POINTER(PyObject *self, PyObject *cls) if (result == NULL) return result; key = PyLong_FromVoidPtr(result); + if (key == NULL) { + Py_DECREF(result); + return NULL; + } } else if (PyType_Check(cls)) { typ = (PyTypeObject *)cls; buf = PyMem_Malloc(strlen(typ->tp_name) + 3 + 1); diff -r 3d726dbfca31 Modules/_ctypes/cfield.c --- a/Modules/_ctypes/cfield.c Wed Jun 15 17:16:16 2016 -0500 +++ b/Modules/_ctypes/cfield.c Thu Jun 16 10:24:09 2016 +0300 @@ -1246,8 +1246,7 @@ U_set(void *ptr, PyObject *value, Py_ssi "unicode string expected instead of %s instance", value->ob_type->tp_name); return NULL; - } else - Py_INCREF(value); + } wstr = PyUnicode_AsUnicodeAndSize(value, &size); if (wstr == NULL) @@ -1266,6 +1265,7 @@ U_set(void *ptr, PyObject *value, Py_ssi return NULL; } + Py_INCREF(value); return value; } @@ -1292,9 +1292,7 @@ s_set(void *ptr, PyObject *value, Py_ssi char *data; Py_ssize_t size; - if(PyBytes_Check(value)) { - Py_INCREF(value); - } else { + if(!PyBytes_Check(value)) { PyErr_Format(PyExc_TypeError, "expected bytes, %s found", value->ob_type->tp_name); @@ -1302,11 +1300,9 @@ s_set(void *ptr, PyObject *value, Py_ssi } data = PyBytes_AS_STRING(value); - if (!data) - return NULL; size = strlen(data); /* XXX Why not Py_SIZE(value)? */ if (size < length) { - /* This will copy the leading NUL character + /* This will copy the terminating NUL character * if there is space for it. */ ++size; @@ -1314,13 +1310,11 @@ s_set(void *ptr, PyObject *value, Py_ssi PyErr_Format(PyExc_ValueError, "bytes too long (%zd, maximum length %zd)", size, length); - Py_DECREF(value); return NULL; } /* Also copy the terminating NUL character if there is space */ memcpy((char *)ptr, data, size); - Py_DECREF(value); _RET(value); } @@ -1428,9 +1422,7 @@ BSTR_set(void *ptr, PyObject *value, Py_ /* convert value into a PyUnicodeObject or NULL */ if (Py_None == value) { value = NULL; - } else if (PyUnicode_Check(value)) { - Py_INCREF(value); /* for the descref below */ - } else { + } else if (!PyUnicode_Check(value)) { PyErr_Format(PyExc_TypeError, "unicode string expected instead of %s instance", value->ob_type->tp_name); @@ -1448,6 +1440,7 @@ BSTR_set(void *ptr, PyObject *value, Py_ PyErr_SetString(PyExc_ValueError, "String too long for BSTR"); return NULL; } + Py_INCREF(value); bstr = SysAllocStringLen(wvalue, (unsigned)wsize); Py_DECREF(value); } else diff -r 3d726dbfca31 Modules/_ctypes/stgdict.c --- a/Modules/_ctypes/stgdict.c Wed Jun 15 17:16:16 2016 -0500 +++ b/Modules/_ctypes/stgdict.c Thu Jun 16 10:24:09 2016 +0300 @@ -340,13 +340,12 @@ PyCStructUnionType_update_stgdict(PyObje isPacked = PyObject_GetAttrString(type, "_pack_"); if (isPacked) { pack = _PyLong_AsInt(isPacked); - if (pack < 0 || PyErr_Occurred()) { - Py_XDECREF(isPacked); + Py_DECREF(isPacked); + if (pack < 0) { /* negative or error */ PyErr_SetString(PyExc_ValueError, "_pack_ must be a non-negative integer"); return -1; } - Py_DECREF(isPacked); } else PyErr_Clear();