ext/ldap: Move server controls check prior to allocating modifications

This commit is contained in:
Gina Peter Banyard 2024-09-26 00:09:18 +01:00
parent 5300f38b75
commit 8b0933b610

View file

@ -2494,7 +2494,7 @@ PHP_FUNCTION(ldap_delete_ext)
/* {{{ Perform multiple modifications as part of one operation */ /* {{{ Perform multiple modifications as part of one operation */
PHP_FUNCTION(ldap_modify_batch) PHP_FUNCTION(ldap_modify_batch)
{ {
zval *serverctrls = NULL; zval *server_controls_zv = NULL;
zval *link; zval *link;
char *dn; char *dn;
size_t dn_len; size_t dn_len;
@ -2525,7 +2525,7 @@ PHP_FUNCTION(ldap_modify_batch)
]; ];
*/ */
if (zend_parse_parameters(ZEND_NUM_ARGS(), "Osh/|a!", &link, ldap_link_ce, &dn, &dn_len, &modifications, &serverctrls) != SUCCESS) { if (zend_parse_parameters(ZEND_NUM_ARGS(), "Osh/|a!", &link, ldap_link_ce, &dn, &dn_len, &modifications, &server_controls_zv) != SUCCESS) {
RETURN_THROWS(); RETURN_THROWS();
} }
@ -2637,7 +2637,16 @@ PHP_FUNCTION(ldap_modify_batch)
RETURN_THROWS(); RETURN_THROWS();
} }
} ZEND_HASH_FOREACH_END(); } ZEND_HASH_FOREACH_END();
/* validation was successful */ /* validation of modifications array was successful */
/* Check that the LDAP server controls array is valid */
if (server_controls_zv) {
lserverctrls = _php_ldap_controls_from_array(ld->link, server_controls_zv, 4);
if (lserverctrls == NULL) {
_php_ldap_controls_free(&lserverctrls);
RETURN_FALSE;
}
}
/* allocate array of modifications */ /* allocate array of modifications */
uint32_t num_mods = zend_hash_num_elements(modifications); uint32_t num_mods = zend_hash_num_elements(modifications);
@ -2712,14 +2721,6 @@ PHP_FUNCTION(ldap_modify_batch)
/* NULL-terminate modifications */ /* NULL-terminate modifications */
ldap_mods[num_mods] = NULL; ldap_mods[num_mods] = NULL;
if (serverctrls) {
lserverctrls = _php_ldap_controls_from_array(ld->link, serverctrls, 4);
if (lserverctrls == NULL) {
RETVAL_FALSE;
goto cleanup;
}
}
/* perform (finally) */ /* perform (finally) */
int ldap_status = ldap_modify_ext_s(ld->link, dn, ldap_mods, lserverctrls, NULL); int ldap_status = ldap_modify_ext_s(ld->link, dn, ldap_mods, lserverctrls, NULL);
if (ldap_status != LDAP_SUCCESS) { if (ldap_status != LDAP_SUCCESS) {