From c86b8e9419db8d7b7752fc0a6d8bb79c9da6ba41 Mon Sep 17 00:00:00 2001 From: Christian Heimes Date: Mon, 4 Dec 2017 11:51:03 +0100 Subject: [PATCH] Fix error handling of LDAPControl_to_List() (#89) LDAPControls_to_List() may have returned a partly filled list in case Py_BuildValue() fails. In case of an error, DECREF the list and return NULL. https://github.com/python-ldap/python-ldap/pull/89 Closes: https://github.com/python-ldap/python-ldap/issues/22 Signed-off-by: Christian Heimes --- CHANGES | 1 + Modules/ldapcontrol.c | 21 ++++++++++----------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/CHANGES b/CHANGES index 58dbde9..6cbb845 100644 --- a/CHANGES +++ b/CHANGES @@ -34,6 +34,7 @@ Modules/ * Fix reference leak in result4 * Fix several compiler warnings * Fix memory leak in whoami +* Fix internal error handling of LDAPControl_to_List() and, thanks to Michael Ströder: * removed unused code schema.c * moved code from version.c to ldapmodule.c diff --git a/Modules/ldapcontrol.c b/Modules/ldapcontrol.c index 7d8fbe3..5cd30f9 100644 --- a/Modules/ldapcontrol.c +++ b/Modules/ldapcontrol.c @@ -172,22 +172,21 @@ LDAPControls_to_List(LDAPControl **ldcs) if (tmp) while (*tmp++) num_ctrls++; - if (!(res = PyList_New(num_ctrls))) - goto endlbl; + if ((res = PyList_New(num_ctrls)) == NULL) { + return NULL; + } for (i = 0; i < num_ctrls; i++) { - if (!(pyctrl = Py_BuildValue("sbO&", ldcs[i]->ldctl_oid, - ldcs[i]->ldctl_iscritical, - LDAPberval_to_object, - &ldcs[i]->ldctl_value))) { - goto endlbl; + pyctrl = Py_BuildValue("sbO&", + ldcs[i]->ldctl_oid, + ldcs[i]->ldctl_iscritical, + LDAPberval_to_object, &ldcs[i]->ldctl_value); + if (pyctrl == NULL) { + Py_DECREF(res); + return NULL; } PyList_SET_ITEM(res, i, pyctrl); } - Py_INCREF(res); - - endlbl: - Py_XDECREF(res); return res; }