diff options
author | Patrick Allaert <patrickallaert@php.net> | 2009-06-15 15:04:11 +0000 |
---|---|---|
committer | Patrick Allaert <patrickallaert@php.net> | 2009-06-15 15:04:11 +0000 |
commit | 91a8fd7f7eb147d76be88f4ead277e29f74b62fb (patch) | |
tree | 62877a3661c25594de4a7b0995acc4d1c44f631d /ext/ldap/ldap.c | |
parent | 60223d6a6d7c0091532240251cdf80ce209792fe (diff) | |
download | php-git-91a8fd7f7eb147d76be88f4ead277e29f74b62fb.tar.gz |
MFH: Refactoring that will help fixing #48441
Diffstat (limited to 'ext/ldap/ldap.c')
-rw-r--r-- | ext/ldap/ldap.c | 122 |
1 files changed, 56 insertions, 66 deletions
diff --git a/ext/ldap/ldap.c b/ext/ldap/ldap.c index eda4bff535..cee80ed000 100644 --- a/ext/ldap/ldap.c +++ b/ext/ldap/ldap.c @@ -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,50 +747,61 @@ 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); - 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); + /* 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); } - RETURN_FALSE; - } - - php_set_opts(ld->link, ldap_sizelimit, ldap_timelimit, ldap_deref); - /* Run the actual search */ - errno = ldap_search_s(ld->link, ldap_base_dn, scope, ldap_filter, ldap_attrs, ldap_attrsonly, &ldap_res); + ld = (ldap_linkdata *) zend_fetch_resource(link TSRMLS_CC, -1, "ldap link", NULL, 1, le_link); + if (ld == NULL) { + ret = 0; + goto cleanup; + } - if (ldap_attrs != NULL) { - efree(ldap_attrs); - } + php_set_opts(ld->link, ldap_sizelimit, ldap_timelimit, ldap_deref); - if (errno != LDAP_SUCCESS - && errno != LDAP_SIZELIMIT_EXCEEDED + /* Run the actual search */ + errno = ldap_search_s(ld->link, ldap_base_dn, scope, ldap_filter, ldap_attrs, ldap_attrsonly, &ldap_res); + + if (errno != LDAP_SUCCESS + && errno != LDAP_SIZELIMIT_EXCEEDED #ifdef LDAP_ADMINLIMIT_EXCEEDED - && errno != LDAP_ADMINLIMIT_EXCEEDED + && errno != LDAP_ADMINLIMIT_EXCEEDED #endif #ifdef LDAP_REFERRAL - && errno != LDAP_REFERRAL + && errno != LDAP_REFERRAL #endif - ) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Search: %s", ldap_err2string(errno)); - RETVAL_FALSE; - } else { - if (errno == LDAP_SIZELIMIT_EXCEEDED) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Partial search results returned: Sizelimit exceeded"); - } + ) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Search: %s", ldap_err2string(errno)); + ret = 0; + } else { + if (errno == LDAP_SIZELIMIT_EXCEEDED) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Partial search results returned: Sizelimit exceeded"); + } #ifdef LDAP_ADMINLIMIT_EXCEEDED - else if (errno == LDAP_ADMINLIMIT_EXCEEDED) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Partial search results returned: Adminlimit exceeded"); - } + else if (errno == LDAP_ADMINLIMIT_EXCEEDED) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Partial search results returned: Adminlimit exceeded"); + } #endif - - ZEND_REGISTER_RESOURCE(return_value, ldap_res, le_result); + + ZEND_REGISTER_RESOURCE(return_value, ldap_res, le_result); + } + } + +cleanup: + if (ldap_attrs != NULL) { + efree(ldap_attrs); + } + if (!ret) { + RETVAL_BOOL(ret); } } /* }}} */ |