summaryrefslogtreecommitdiffstats
path: root/Modules
diff options
context:
space:
mode:
authorZackery Spytz <zspytz@gmail.com>2019-03-25 14:15:36 (GMT)
committerSerhiy Storchaka <storchaka@gmail.com>2019-03-25 14:15:36 (GMT)
commit0516f81828887a8ec34a3d5ed342dd396f367dcd (patch)
tree3e2ea4c35538fea624e3ddb0a0a61c1e78fd7951 /Modules
parent469b0a50d990bcb441910b23194c131e403c2833 (diff)
downloadcpython-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.c13
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
}