From 0778a20f8b9aa4d5ade759236b167cf0b234b1d4 Mon Sep 17 00:00:00 2001 From: Christian Heimes Date: Tue, 28 Nov 2017 11:10:13 +0100 Subject: [PATCH] Fix reference leak in result4 Two error cases are missing a Py_XDECREF(valuestr). A password change with an invalid old password triggers a reference leak. Closes: https://github.com/python-ldap/python-ldap/issues/37 https://github.com/python-ldap/python-ldap/pull/38 Signed-off-by: Christian Heimes --- Modules/LDAPObject.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Modules/LDAPObject.c b/Modules/LDAPObject.c index b066cdf..1c0591c 100644 --- a/Modules/LDAPObject.c +++ b/Modules/LDAPObject.c @@ -998,7 +998,7 @@ l_ldap_result4( LDAPObject* self, PyObject *args ) PyObject *result_str, *retval, *pmsg, *pyctrls = 0; int res_msgid = 0; char *retoid = 0; - PyObject *valuestr = 0; + PyObject *valuestr = NULL; if (!PyArg_ParseTuple( args, "|iidiii", &msgid, &all, &timeout, &add_ctrls, &add_intermediates, &add_extop )) return NULL; @@ -1071,6 +1071,7 @@ l_ldap_result4( LDAPObject* self, PyObject *args ) } else e = "ldap_parse_result"; ldap_msgfree(msg); + Py_XDECREF(valuestr); return LDAPerror( self->ldap, e ); } @@ -1080,6 +1081,7 @@ l_ldap_result4( LDAPObject* self, PyObject *args ) ldap_set_option(self->ldap, LDAP_OPT_ERROR_NUMBER, &err); LDAP_END_ALLOW_THREADS( self ); ldap_msgfree(msg); + Py_XDECREF(valuestr); return LDAPerror(self->ldap, "LDAPControls_to_List"); } ldap_controls_free(serverctrls); @@ -1108,9 +1110,7 @@ l_ldap_result4( LDAPObject* self, PyObject *args ) Py_DECREF(pmsg); } } - if (valuestr) { - Py_DECREF(valuestr); - } + Py_XDECREF(valuestr); Py_XDECREF(pyctrls); Py_DECREF(result_str); return retval;