PyAPI: fix leak in unlikely case converting idprops fail

This commit is contained in:
2016-07-31 16:59:08 +10:00
parent 2dfc954c4a
commit e97ab8347a

View File

@@ -98,7 +98,7 @@ static PyObject *idprop_py_from_idp_array(ID *id, IDProperty *prop)
static PyObject *idprop_py_from_idp_idparray(ID *id, IDProperty *prop) static PyObject *idprop_py_from_idp_idparray(ID *id, IDProperty *prop)
{ {
PyObject *seq = PyList_New(prop->len), *wrap; PyObject *seq = PyList_New(prop->len);
IDProperty *array = IDP_IDPArray(prop); IDProperty *array = IDP_IDPArray(prop);
int i; int i;
@@ -110,10 +110,13 @@ static PyObject *idprop_py_from_idp_idparray(ID *id, IDProperty *prop)
} }
for (i = 0; i < prop->len; i++) { for (i = 0; i < prop->len; i++) {
wrap = BPy_IDGroup_WrapData(id, array++, prop); PyObject *wrap = BPy_IDGroup_WrapData(id, array++, prop);
if (!wrap) /* BPy_IDGroup_MapDataToPy sets the error */ /* BPy_IDGroup_MapDataToPy sets the error */
if (UNLIKELY(wrap == NULL)) {
Py_DECREF(seq);
return NULL; return NULL;
}
PyList_SET_ITEM(seq, i, wrap); PyList_SET_ITEM(seq, i, wrap);
} }
@@ -659,7 +662,7 @@ static PyObject *BPy_IDGroup_MapDataToPy(IDProperty *prop)
} }
case IDP_IDPARRAY: case IDP_IDPARRAY:
{ {
PyObject *seq = PyList_New(prop->len), *wrap; PyObject *seq = PyList_New(prop->len);
IDProperty *array = IDP_IDPArray(prop); IDProperty *array = IDP_IDPArray(prop);
int i; int i;
@@ -671,10 +674,13 @@ static PyObject *BPy_IDGroup_MapDataToPy(IDProperty *prop)
} }
for (i = 0; i < prop->len; i++) { for (i = 0; i < prop->len; i++) {
wrap = BPy_IDGroup_MapDataToPy(array++); PyObject *wrap = BPy_IDGroup_MapDataToPy(array++);
if (!wrap) /* BPy_IDGroup_MapDataToPy sets the error */ /* BPy_IDGroup_MapDataToPy sets the error */
if (UNLIKELY(wrap == NULL)) {
Py_DECREF(seq);
return NULL; return NULL;
}
PyList_SET_ITEM(seq, i, wrap); PyList_SET_ITEM(seq, i, wrap);
} }
@@ -682,14 +688,17 @@ static PyObject *BPy_IDGroup_MapDataToPy(IDProperty *prop)
} }
case IDP_GROUP: case IDP_GROUP:
{ {
PyObject *dict = PyDict_New(), *wrap; PyObject *dict = PyDict_New();
IDProperty *loop; IDProperty *loop;
for (loop = prop->data.group.first; loop; loop = loop->next) { for (loop = prop->data.group.first; loop; loop = loop->next) {
wrap = BPy_IDGroup_MapDataToPy(loop); PyObject *wrap = BPy_IDGroup_MapDataToPy(loop);
if (!wrap) /* BPy_IDGroup_MapDataToPy sets the error */ /* BPy_IDGroup_MapDataToPy sets the error */
if (UNLIKELY(wrap == NULL)) {
Py_DECREF(dict);
return NULL; return NULL;
}
PyDict_SetItemString(dict, loop->name, wrap); PyDict_SetItemString(dict, loop->name, wrap);
Py_DECREF(wrap); Py_DECREF(wrap);