diff options
author | Zackery Spytz <zspytz@gmail.com> | 2019-03-25 14:15:36 (GMT) |
---|---|---|
committer | Serhiy Storchaka <storchaka@gmail.com> | 2019-03-25 14:15:36 (GMT) |
commit | 0516f81828887a8ec34a3d5ed342dd396f367dcd (patch) | |
tree | 3e2ea4c35538fea624e3ddb0a0a61c1e78fd7951 /Modules | |
parent | 469b0a50d990bcb441910b23194c131e403c2833 (diff) | |
download | cpython-0516f81828887a8ec34a3d5ed342dd396f367dcd.zip cpython-0516f81828887a8ec34a3d5ed342dd396f367dcd.tar.gz cpython-0516f81828887a8ec34a3d5ed342dd396f367dcd.tar.bz2 |
[2.7] bpo-36421: Fix ref counting bugs in _ctypes.c's PyCArrayType_new(). (GH-12534)
Add missing Py_DECREF()s.
Diffstat (limited to 'Modules')
-rw-r--r-- | Modules/_ctypes/_ctypes.c | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c index 8abcd30..3a3aabb 100644 --- a/Modules/_ctypes/_ctypes.c +++ b/Modules/_ctypes/_ctypes.c @@ -1537,6 +1537,7 @@ PyCArrayType_new(PyTypeObject *type, PyObject *args, PyObject *kwds) if (length * itemsize < 0) { PyErr_SetString(PyExc_OverflowError, "array too large"); + Py_DECREF(stgdict); return NULL; } @@ -1559,8 +1560,10 @@ PyCArrayType_new(PyTypeObject *type, PyObject *args, PyObject *kwds) /* create the new instance (which is a class, since we are a metatype!) */ result = (PyTypeObject *)PyType_Type.tp_new(type, args, kwds); - if (result == NULL) + if (result == NULL) { + Py_DECREF(stgdict); return NULL; + } /* replace the class dict by our updated spam dict */ if (-1 == PyDict_Update((PyObject *)stgdict, result->tp_dict)) { @@ -1574,12 +1577,16 @@ PyCArrayType_new(PyTypeObject *type, PyObject *args, PyObject *kwds) A permanent annoyance: char arrays are also strings! */ if (itemdict->getfunc == _ctypes_get_fielddesc("c")->getfunc) { - if (-1 == add_getset(result, CharArray_getsets)) + if (-1 == add_getset(result, CharArray_getsets)) { + Py_DECREF(result); return NULL; + } #ifdef CTYPES_UNICODE } else if (itemdict->getfunc == _ctypes_get_fielddesc("u")->getfunc) { - if (-1 == add_getset(result, WCharArray_getsets)) + if (-1 == add_getset(result, WCharArray_getsets)) { + Py_DECREF(result); return NULL; + } #endif } |