MFH: Refactoring that will help fixing #48441

This commit is contained in:
Patrick Allaert 2009-06-15 15:04:11 +00:00
parent 60223d6a6d
commit 91a8fd7f7e

View file

@ -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);
}
}
/* }}} */