Skip to content

Commit eafb208

Browse files
committed
FIX: Handle potential mem leak by properly DECREF.
1 parent f198e16 commit eafb208

File tree

1 file changed

+13
-3
lines changed

1 file changed

+13
-3
lines changed

devsupApp/src/dbfield.c

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,12 @@ static PyObject* build_array(PyObject* obj, void *data, unsigned short ftype, un
106106
}
107107

108108
Py_XINCREF(desc);
109-
return PyArray_NewFromDescr(&PyArray_Type, desc, ndims, dims, NULL, data, flags, (PyObject*)obj);
109+
PyObject *out_arr = PyArray_NewFromDescr(&PyArray_Type, desc, ndims, dims, NULL, data, flags, (PyObject*)obj);
110+
if(!out_arr) {
111+
Py_XDECREF(desc);
112+
return NULL;
113+
}
114+
return out_arr;
110115
#else
111116
PyErr_SetNone(PyExc_NotImplementedError);
112117
return NULL;
@@ -119,7 +124,7 @@ static int assign_array(DBADDR *paddr, PyObject *arr)
119124
void *rawfield = paddr->pfield;
120125
rset *prset;
121126
PyObject *aval;
122-
PyArrayObject * array = (PyArrayObject *)arr;
127+
PyArrayObject *array = (PyArrayObject *)arr;
123128
unsigned elemsize = dbValueSize(paddr->field_type);
124129
unsigned long maxlen = paddr->no_elements, insize;
125130
PyArray_Descr *desc = dbf2np[paddr->field_type];
@@ -159,18 +164,23 @@ static int assign_array(DBADDR *paddr, PyObject *arr)
159164
}
160165

161166
Py_XINCREF(desc);
162-
if(!(aval = PyArray_FromAny(arr, desc, 1, 2, NPY_ARRAY_C_CONTIGUOUS | NPY_ARRAY_ALIGNED | NPY_ARRAY_WRITEABLE, arr)))
167+
if(!(aval = PyArray_FromAny(arr, desc, 1, 2, NPY_ARRAY_C_CONTIGUOUS | NPY_ARRAY_ALIGNED | NPY_ARRAY_WRITEABLE, arr))) {
168+
Py_XDECREF(desc);
163169
return 1;
170+
}
164171

165172
if(elemsize!=PyArray_ITEMSIZE((PyArrayObject *)aval)) {
166173
PyErr_Format(PyExc_AssertionError, "item size mismatch %u %u",
167174
elemsize, (unsigned)PyArray_ITEMSIZE((PyArrayObject *)aval) );
175+
Py_DECREF(aval);
176+
Py_XDECREF(desc);
168177
return 1;
169178
}
170179

171180
memcpy(rawfield, PyArray_GETPTR1((PyArrayObject *)aval, 0), insize*elemsize);
172181

173182
Py_DECREF(aval);
183+
Py_XDECREF(desc);
174184

175185
if(paddr->special==SPC_DBADDR &&
176186
(prset=dbGetRset(paddr)) &&

0 commit comments

Comments
 (0)