Skip to content

Commit f8d8942

Browse files
committed
fixing ldap memory leaks php#3
1 parent 42c0dd5 commit f8d8942

File tree

1 file changed

+32
-22
lines changed

1 file changed

+32
-22
lines changed

ext/ldap/ldap.c

Lines changed: 32 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -4259,23 +4259,23 @@ PHP_FUNCTION(ldap_exop)
42594259
PHP_FUNCTION(ldap_exop_passwd)
42604260
{
42614261
zval *link, *serverctrls;
4262-
struct berval luser, loldpw, lnewpw, lgenpasswd;
4262+
struct berval luser = { 0L, NULL };
4263+
struct berval loldpw = { 0L, NULL };
4264+
struct berval lnewpw = { 0L, NULL };
4265+
struct berval lgenpasswd = { 0L, NULL };
42634266
LDAPControl *ctrl, **lserverctrls = NULL, *requestctrls[2] = { NULL, NULL };
4264-
LDAPMessage* ldap_res;
4267+
LDAPMessage* ldap_res = NULL;
42654268
ldap_linkdata *ld;
42664269
int rc, myargcount = ZEND_NUM_ARGS(), msgid, err;
4267-
char* errmsg;
4268-
4269-
luser.bv_len = 0;
4270-
loldpw.bv_len = 0;
4271-
lnewpw.bv_len = 0;
4270+
char* errmsg = NULL;
42724271

42734272
if (zend_parse_parameters(myargcount, "r|sssz/", &link, &luser.bv_val, &luser.bv_len, &loldpw.bv_val, &loldpw.bv_len, &lnewpw.bv_val, &lnewpw.bv_len, &serverctrls) == FAILURE) {
42744273
return;
42754274
}
42764275

42774276
if ((ld = (ldap_linkdata *)zend_fetch_resource(Z_RES_P(link), "ldap link", le_link)) == NULL) {
4278-
RETURN_FALSE;
4277+
RETVAL_FALSE;
4278+
goto cleanup;
42794279
}
42804280

42814281
switch (myargcount) {
@@ -4299,30 +4299,23 @@ PHP_FUNCTION(ldap_exop_passwd)
42994299

43004300
if (rc != LDAP_SUCCESS ) {
43014301
php_error_docref(NULL, E_WARNING, "Passwd modify extended operation failed: %s (%d)", ldap_err2string(rc), rc);
4302-
RETURN_FALSE;
4302+
RETVAL_FALSE;
4303+
goto cleanup;
43034304
}
43044305

43054306
rc = ldap_result(ld->link, msgid, 1 /* LDAP_MSG_ALL */, NULL, &ldap_res);
43064307
if ((rc < 0) || !ldap_res) {
43074308
rc = _get_lderrno(ld->link);
43084309
php_error_docref(NULL, E_WARNING, "Passwd modify extended operation failed: %s (%d)", ldap_err2string(rc), rc);
4309-
RETURN_FALSE;
4310+
RETVAL_FALSE;
4311+
goto cleanup;
43104312
}
43114313

43124314
rc = ldap_parse_passwd(ld->link, ldap_res, &lgenpasswd);
43134315
if( rc != LDAP_SUCCESS ) {
43144316
php_error_docref(NULL, E_WARNING, "Passwd modify extended operation failed: %s (%d)", ldap_err2string(rc), rc);
4315-
ldap_msgfree(ldap_res);
4316-
RETURN_FALSE;
4317-
}
4318-
4319-
rc = ldap_parse_result(ld->link, ldap_res, &err, NULL, &errmsg, NULL, (myargcount > 4 ? &lserverctrls : NULL), 1); /* memleak: ??? */
4320-
if( rc != LDAP_SUCCESS ) {
4321-
php_error_docref(NULL, E_WARNING, "Passwd modify extended operation failed: %s (%d)", ldap_err2string(rc), rc);
4322-
if (lserverctrls) {
4323-
ldap_controls_free(lserverctrls);
4324-
}
4325-
RETURN_FALSE;
4317+
RETVAL_FALSE;
4318+
goto cleanup;
43264319
}
43274320

43284321
if (lnewpw.bv_len == 0) {
@@ -4336,13 +4329,30 @@ PHP_FUNCTION(ldap_exop_passwd)
43364329
} else {
43374330
php_error_docref(NULL, E_WARNING, "Passwd modify extended operation failed: %s (%d)", (errmsg ? errmsg : ldap_err2string(err)), err);
43384331
RETVAL_FALSE;
4332+
goto cleanup;
4333+
}
4334+
4335+
rc = ldap_parse_result(ld->link, ldap_res, &err, NULL, &errmsg, NULL, (myargcount > 4 ? &lserverctrls : NULL), 0); /* memleak: ??? */
4336+
if( rc != LDAP_SUCCESS ) {
4337+
php_error_docref(NULL, E_WARNING, "Passwd modify extended operation failed: %s (%d)", ldap_err2string(rc), rc);
4338+
RETVAL_FALSE;
4339+
goto cleanup;
43394340
}
43404341

43414342
if (myargcount > 4) {
43424343
_php_ldap_controls_to_array(ld->link, lserverctrls, serverctrls, 0);
43434344
}
43444345

4345-
ldap_memfree(lgenpasswd.bv_val);
4346+
cleanup:
4347+
if (lgenpasswd.bv_val != NULL) {
4348+
ldap_memfree(lgenpasswd.bv_val);
4349+
}
4350+
if (ldap_res != NULL) {
4351+
ldap_msgfree(ldap_res);
4352+
}
4353+
if (errmsg != NULL) {
4354+
ldap_memfree(errmsg);
4355+
}
43464356
}
43474357
/* }}} */
43484358
#endif

0 commit comments

Comments
 (0)