mirror of
https://github.com/php/php-src.git
synced 2025-08-18 06:58:55 +02:00
MFH: Refactoring that will help fixing #48441
This commit is contained in:
parent
60223d6a6d
commit
91a8fd7f7e
1 changed files with 60 additions and 70 deletions
|
@ -592,6 +592,7 @@ static void php_ldap_do_search(INTERNAL_FUNCTION_PARAMETERS, int scope)
|
|||
int num_attribs = 0;
|
||||
int i, errno;
|
||||
int myargcount = ZEND_NUM_ARGS();
|
||||
int ret = 1;
|
||||
|
||||
if (zend_parse_parameters(myargcount TSRMLS_CC, "ZZZ|ZZZZZ", &link, &base_dn, &filter, &attrs, &attrsonly,
|
||||
&sizelimit, &timelimit, &deref) == FAILURE) {
|
||||
|
@ -619,7 +620,8 @@ static void php_ldap_do_search(INTERNAL_FUNCTION_PARAMETERS, int scope)
|
|||
case 4 :
|
||||
if (Z_TYPE_PP(attrs) != IS_ARRAY) {
|
||||
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Expected Array as last element");
|
||||
RETURN_FALSE;
|
||||
ret = 0;
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
num_attribs = zend_hash_num_elements(Z_ARRVAL_PP(attrs));
|
||||
|
@ -628,8 +630,8 @@ static void php_ldap_do_search(INTERNAL_FUNCTION_PARAMETERS, int scope)
|
|||
for (i = 0; i<num_attribs; i++) {
|
||||
if (zend_hash_index_find(Z_ARRVAL_PP(attrs), i, (void **) &attr) != SUCCESS) {
|
||||
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Array initialization wrong");
|
||||
efree(ldap_attrs);
|
||||
RETURN_FALSE;
|
||||
ret = 0;
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
SEPARATE_ZVAL(attr);
|
||||
|
@ -639,16 +641,7 @@ static void php_ldap_do_search(INTERNAL_FUNCTION_PARAMETERS, int scope)
|
|||
ldap_attrs[num_attribs] = NULL;
|
||||
|
||||
case 3 :
|
||||
/* parallel search? */
|
||||
if (Z_TYPE_PP(link) != IS_ARRAY) {
|
||||
convert_to_string_ex(filter);
|
||||
ldap_filter = Z_STRVAL_PP(filter);
|
||||
|
||||
/* If anything else than string is passed, ldap_base_dn = NULL */
|
||||
if (Z_TYPE_PP(base_dn) == IS_STRING) {
|
||||
ldap_base_dn = Z_STRVAL_PP(base_dn);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
|
@ -665,20 +658,16 @@ static void php_ldap_do_search(INTERNAL_FUNCTION_PARAMETERS, int scope)
|
|||
nlinks = zend_hash_num_elements(Z_ARRVAL_PP(link));
|
||||
if (nlinks == 0) {
|
||||
php_error_docref(NULL TSRMLS_CC, E_WARNING, "No links in link array");
|
||||
if (ldap_attrs != NULL) {
|
||||
efree(ldap_attrs);
|
||||
}
|
||||
RETURN_FALSE;
|
||||
ret = 0;
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
if (Z_TYPE_PP(base_dn) == IS_ARRAY) {
|
||||
nbases = zend_hash_num_elements(Z_ARRVAL_PP(base_dn));
|
||||
if (nbases != nlinks) {
|
||||
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Base must either be a string, or an array with the same number of elements as the links array");
|
||||
if (ldap_attrs != NULL) {
|
||||
efree(ldap_attrs);
|
||||
}
|
||||
RETURN_FALSE;
|
||||
ret = 0;
|
||||
goto cleanup;
|
||||
}
|
||||
zend_hash_internal_pointer_reset(Z_ARRVAL_PP(base_dn));
|
||||
} else {
|
||||
|
@ -695,10 +684,8 @@ static void php_ldap_do_search(INTERNAL_FUNCTION_PARAMETERS, int scope)
|
|||
nfilters = zend_hash_num_elements(Z_ARRVAL_PP(filter));
|
||||
if (nfilters != nlinks) {
|
||||
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Filter must either be a string, or an array with the same number of elements as the links array");
|
||||
if (ldap_attrs != NULL) {
|
||||
efree(ldap_attrs);
|
||||
}
|
||||
RETURN_FALSE;
|
||||
ret = 0;
|
||||
goto cleanup;
|
||||
}
|
||||
zend_hash_internal_pointer_reset(Z_ARRVAL_PP(filter));
|
||||
} else {
|
||||
|
@ -716,12 +703,8 @@ static void php_ldap_do_search(INTERNAL_FUNCTION_PARAMETERS, int scope)
|
|||
|
||||
ld = (ldap_linkdata *) zend_fetch_resource(entry TSRMLS_CC, -1, "ldap link", NULL, 1, le_link);
|
||||
if (ld == NULL) {
|
||||
efree(lds);
|
||||
efree(rcs);
|
||||
if (ldap_attrs != NULL) {
|
||||
efree(ldap_attrs);
|
||||
}
|
||||
RETURN_FALSE;
|
||||
ret = 0;
|
||||
goto cleanup_parallel;
|
||||
}
|
||||
if (nbases != 0) { /* base_dn an array? */
|
||||
zend_hash_get_current_data(Z_ARRVAL_PP(base_dn), (void **)&entry);
|
||||
|
@ -749,10 +732,6 @@ static void php_ldap_do_search(INTERNAL_FUNCTION_PARAMETERS, int scope)
|
|||
zend_hash_move_forward(Z_ARRVAL_PP(link));
|
||||
}
|
||||
|
||||
if (ldap_attrs != NULL) {
|
||||
efree(ldap_attrs);
|
||||
}
|
||||
|
||||
array_init(return_value);
|
||||
|
||||
/* Collect results from the searches */
|
||||
|
@ -768,17 +747,23 @@ static void php_ldap_do_search(INTERNAL_FUNCTION_PARAMETERS, int scope)
|
|||
add_next_index_bool(return_value, 0);
|
||||
}
|
||||
}
|
||||
|
||||
cleanup_parallel:
|
||||
efree(lds);
|
||||
efree(rcs);
|
||||
return;
|
||||
} else {
|
||||
convert_to_string_ex(filter);
|
||||
ldap_filter = Z_STRVAL_PP(filter);
|
||||
|
||||
/* If anything else than string is passed, ldap_base_dn = NULL */
|
||||
if (Z_TYPE_PP(base_dn) == IS_STRING) {
|
||||
ldap_base_dn = Z_STRVAL_PP(base_dn);
|
||||
}
|
||||
|
||||
ld = (ldap_linkdata *) zend_fetch_resource(link TSRMLS_CC, -1, "ldap link", NULL, 1, le_link);
|
||||
if (ld == NULL) {
|
||||
if (ldap_attrs != NULL) {
|
||||
efree(ldap_attrs);
|
||||
}
|
||||
RETURN_FALSE;
|
||||
ret = 0;
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
php_set_opts(ld->link, ldap_sizelimit, ldap_timelimit, ldap_deref);
|
||||
|
@ -786,10 +771,6 @@ static void php_ldap_do_search(INTERNAL_FUNCTION_PARAMETERS, int scope)
|
|||
/* Run the actual search */
|
||||
errno = ldap_search_s(ld->link, ldap_base_dn, scope, ldap_filter, ldap_attrs, ldap_attrsonly, &ldap_res);
|
||||
|
||||
if (ldap_attrs != NULL) {
|
||||
efree(ldap_attrs);
|
||||
}
|
||||
|
||||
if (errno != LDAP_SUCCESS
|
||||
&& errno != LDAP_SIZELIMIT_EXCEEDED
|
||||
#ifdef LDAP_ADMINLIMIT_EXCEEDED
|
||||
|
@ -800,7 +781,7 @@ static void php_ldap_do_search(INTERNAL_FUNCTION_PARAMETERS, int scope)
|
|||
#endif
|
||||
) {
|
||||
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Search: %s", ldap_err2string(errno));
|
||||
RETVAL_FALSE;
|
||||
ret = 0;
|
||||
} else {
|
||||
if (errno == LDAP_SIZELIMIT_EXCEEDED) {
|
||||
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Partial search results returned: Sizelimit exceeded");
|
||||
|
@ -813,6 +794,15 @@ static void php_ldap_do_search(INTERNAL_FUNCTION_PARAMETERS, int scope)
|
|||
|
||||
ZEND_REGISTER_RESOURCE(return_value, ldap_res, le_result);
|
||||
}
|
||||
}
|
||||
|
||||
cleanup:
|
||||
if (ldap_attrs != NULL) {
|
||||
efree(ldap_attrs);
|
||||
}
|
||||
if (!ret) {
|
||||
RETVAL_BOOL(ret);
|
||||
}
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue