Skip to content

Commit 8b0933b

Browse files
committed
ext/ldap: Move server controls check prior to allocating modifications
1 parent 5300f38 commit 8b0933b

File tree

1 file changed

+12
-11
lines changed

1 file changed

+12
-11
lines changed

ext/ldap/ldap.c

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2494,7 +2494,7 @@ PHP_FUNCTION(ldap_delete_ext)
24942494
/* {{{ Perform multiple modifications as part of one operation */
24952495
PHP_FUNCTION(ldap_modify_batch)
24962496
{
2497-
zval *serverctrls = NULL;
2497+
zval *server_controls_zv = NULL;
24982498
zval *link;
24992499
char *dn;
25002500
size_t dn_len;
@@ -2525,7 +2525,7 @@ PHP_FUNCTION(ldap_modify_batch)
25252525
];
25262526
*/
25272527

2528-
if (zend_parse_parameters(ZEND_NUM_ARGS(), "Osh/|a!", &link, ldap_link_ce, &dn, &dn_len, &modifications, &serverctrls) != SUCCESS) {
2528+
if (zend_parse_parameters(ZEND_NUM_ARGS(), "Osh/|a!", &link, ldap_link_ce, &dn, &dn_len, &modifications, &server_controls_zv) != SUCCESS) {
25292529
RETURN_THROWS();
25302530
}
25312531

@@ -2637,7 +2637,16 @@ PHP_FUNCTION(ldap_modify_batch)
26372637
RETURN_THROWS();
26382638
}
26392639
} ZEND_HASH_FOREACH_END();
2640-
/* validation was successful */
2640+
/* validation of modifications array was successful */
2641+
2642+
/* Check that the LDAP server controls array is valid */
2643+
if (server_controls_zv) {
2644+
lserverctrls = _php_ldap_controls_from_array(ld->link, server_controls_zv, 4);
2645+
if (lserverctrls == NULL) {
2646+
_php_ldap_controls_free(&lserverctrls);
2647+
RETURN_FALSE;
2648+
}
2649+
}
26412650

26422651
/* allocate array of modifications */
26432652
uint32_t num_mods = zend_hash_num_elements(modifications);
@@ -2712,14 +2721,6 @@ PHP_FUNCTION(ldap_modify_batch)
27122721
/* NULL-terminate modifications */
27132722
ldap_mods[num_mods] = NULL;
27142723

2715-
if (serverctrls) {
2716-
lserverctrls = _php_ldap_controls_from_array(ld->link, serverctrls, 4);
2717-
if (lserverctrls == NULL) {
2718-
RETVAL_FALSE;
2719-
goto cleanup;
2720-
}
2721-
}
2722-
27232724
/* perform (finally) */
27242725
int ldap_status = ldap_modify_ext_s(ld->link, dn, ldap_mods, lserverctrls, NULL);
27252726
if (ldap_status != LDAP_SUCCESS) {

0 commit comments

Comments
 (0)