felipe Sat, 15 Aug 2009 00:52:31 +0000 Revision: http://svn.php.net/viewvc?view=revision&revision=287311
Log: - Improved param. parsing for ldap_read(), ldap_search() and ldap_list() Changed paths: U php/php-src/branches/PHP_5_3/ext/ldap/ldap.c U php/php-src/branches/PHP_5_3/ext/ldap/tests/ldap_search_error.phpt U php/php-src/trunk/ext/ldap/ldap.c U php/php-src/trunk/ext/ldap/tests/ldap_search_error.phpt
Modified: php/php-src/branches/PHP_5_3/ext/ldap/ldap.c =================================================================== --- php/php-src/branches/PHP_5_3/ext/ldap/ldap.c 2009-08-14 22:49:38 UTC (rev 287310) +++ php/php-src/branches/PHP_5_3/ext/ldap/ldap.c 2009-08-15 00:52:31 UTC (rev 287311) @@ -585,59 +585,36 @@ */ static void php_ldap_do_search(INTERNAL_FUNCTION_PARAMETERS, int scope) { - zval **link, **base_dn, **filter, **attrs, **attr, **attrsonly, **sizelimit, **timelimit, **deref; - char *ldap_base_dn = NULL; - char *ldap_filter = NULL; - char **ldap_attrs = NULL; + zval *link, *base_dn, **filter, *attrs, **attr; + long attrsonly, sizelimit, timelimit, deref; + char *ldap_base_dn = NULL, *ldap_filter = NULL, **ldap_attrs = NULL; ldap_linkdata *ld = NULL; LDAPMessage *ldap_res; - int ldap_attrsonly = 0; - int ldap_sizelimit = -1; - int ldap_timelimit = -1; - int ldap_deref = -1; - int old_ldap_sizelimit = -1; - int old_ldap_timelimit = -1; - int old_ldap_deref = -1; - int num_attribs = 0; - int i, errno; - int myargcount = ZEND_NUM_ARGS(); - int ret = 1; + int ldap_attrsonly = 0, ldap_sizelimit = -1, ldap_timelimit = -1, ldap_deref = -1; + int old_ldap_sizelimit = -1, old_ldap_timelimit = -1, old_ldap_deref = -1; + int num_attribs = 0, ret = 1, i, errno, argcount = ZEND_NUM_ARGS(); - if (zend_parse_parameters(myargcount TSRMLS_CC, "ZZZ|ZZZZZ", &link, &base_dn, &filter, &attrs, &attrsonly, + if (zend_parse_parameters(argcount TSRMLS_CC, "zzZ|allll", &link, &base_dn, &filter, &attrs, &attrsonly, &sizelimit, &timelimit, &deref) == FAILURE) { return; } /* Reverse -> fall through */ - switch (myargcount) { - case 8 : - convert_to_long_ex(deref); - ldap_deref = Z_LVAL_PP(deref); - - case 7 : - convert_to_long_ex(timelimit); - ldap_timelimit = Z_LVAL_PP(timelimit); - - case 6 : - convert_to_long_ex(sizelimit); - ldap_sizelimit = Z_LVAL_PP(sizelimit); - - case 5 : - convert_to_long_ex(attrsonly); - ldap_attrsonly = Z_LVAL_PP(attrsonly); - - case 4 : - if (Z_TYPE_PP(attrs) != IS_ARRAY) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Expected Array as last element"); - ret = 0; - goto cleanup; - } - - num_attribs = zend_hash_num_elements(Z_ARRVAL_PP(attrs)); + switch (argcount) { + case 8: + ldap_deref = deref; + case 7: + ldap_timelimit = timelimit; + case 6: + ldap_sizelimit = sizelimit; + case 5: + ldap_attrsonly = attrsonly; + case 4: + num_attribs = zend_hash_num_elements(Z_ARRVAL_P(attrs)); ldap_attrs = safe_emalloc((num_attribs+1), sizeof(char *), 0); for (i = 0; i<num_attribs; i++) { - if (zend_hash_index_find(Z_ARRVAL_PP(attrs), i, (void **) &attr) != SUCCESS) { + if (zend_hash_index_find(Z_ARRVAL_P(attrs), i, (void **) &attr) != SUCCESS) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Array initialization wrong"); ret = 0; goto cleanup; @@ -648,42 +625,36 @@ ldap_attrs[i] = Z_STRVAL_PP(attr); } ldap_attrs[num_attribs] = NULL; - - case 3 : - - break; - default: - WRONG_PARAM_COUNT; - break; + break; } /* parallel search? */ - if (Z_TYPE_PP(link) == IS_ARRAY) { + if (Z_TYPE_P(link) == IS_ARRAY) { int i, nlinks, nbases, nfilters, *rcs; ldap_linkdata **lds; zval **entry, *resource; - nlinks = zend_hash_num_elements(Z_ARRVAL_PP(link)); + nlinks = zend_hash_num_elements(Z_ARRVAL_P(link)); if (nlinks == 0) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "No links in link array"); ret = 0; goto cleanup; } - if (Z_TYPE_PP(base_dn) == IS_ARRAY) { - nbases = zend_hash_num_elements(Z_ARRVAL_PP(base_dn)); + if (Z_TYPE_P(base_dn) == IS_ARRAY) { + nbases = zend_hash_num_elements(Z_ARRVAL_P(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"); ret = 0; goto cleanup; } - zend_hash_internal_pointer_reset(Z_ARRVAL_PP(base_dn)); + zend_hash_internal_pointer_reset(Z_ARRVAL_P(base_dn)); } else { nbases = 0; /* this means string, not array */ /* 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); + if (Z_TYPE_P(base_dn) == IS_STRING) { + ldap_base_dn = Z_STRVAL_P(base_dn); } else { ldap_base_dn = NULL; } @@ -706,9 +677,9 @@ lds = safe_emalloc(nlinks, sizeof(ldap_linkdata), 0); rcs = safe_emalloc(nlinks, sizeof(*rcs), 0); - zend_hash_internal_pointer_reset(Z_ARRVAL_PP(link)); + zend_hash_internal_pointer_reset(Z_ARRVAL_P(link)); for (i=0; i<nlinks; i++) { - zend_hash_get_current_data(Z_ARRVAL_PP(link), (void **)&entry); + zend_hash_get_current_data(Z_ARRVAL_P(link), (void **)&entry); ld = (ldap_linkdata *) zend_fetch_resource(entry TSRMLS_CC, -1, "ldap link", NULL, 1, le_link); if (ld == NULL) { @@ -716,8 +687,8 @@ goto cleanup_parallel; } if (nbases != 0) { /* base_dn an array? */ - zend_hash_get_current_data(Z_ARRVAL_PP(base_dn), (void **)&entry); - zend_hash_move_forward(Z_ARRVAL_PP(base_dn)); + zend_hash_get_current_data(Z_ARRVAL_P(base_dn), (void **)&entry); + zend_hash_move_forward(Z_ARRVAL_P(base_dn)); /* If anything else than string is passed, ldap_base_dn = NULL */ if (Z_TYPE_PP(entry) == IS_STRING) { @@ -738,7 +709,7 @@ /* Run the actual search */ rcs[i] = ldap_search(ld->link, ldap_base_dn, scope, ldap_filter, ldap_attrs, ldap_attrsonly); lds[i] = ld; - zend_hash_move_forward(Z_ARRVAL_PP(link)); + zend_hash_move_forward(Z_ARRVAL_P(link)); } array_init(return_value); @@ -765,11 +736,11 @@ 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); + if (Z_TYPE_P(base_dn) == IS_STRING) { + ldap_base_dn = Z_STRVAL_P(base_dn); } - ld = (ldap_linkdata *) zend_fetch_resource(link TSRMLS_CC, -1, "ldap link", NULL, 1, le_link); + ld = (ldap_linkdata *) zend_fetch_resource(&link TSRMLS_CC, -1, "ldap link", NULL, 1, le_link); if (ld == NULL) { ret = 0; goto cleanup; @@ -819,7 +790,7 @@ } /* }}} */ -/* {{{ proto resource ldap_read(resource link, string base_dn, string filter [, array attrs [, int attrsonly [, int sizelimit [, int timelimit [, int deref]]]]]) +/* {{{ proto resource ldap_read(resource|array link, string base_dn, string filter [, array attrs [, int attrsonly [, int sizelimit [, int timelimit [, int deref]]]]]) Read an entry */ PHP_FUNCTION(ldap_read) { @@ -827,7 +798,7 @@ } /* }}} */ -/* {{{ proto resource ldap_list(resource link, string base_dn, string filter [, array attrs [, int attrsonly [, int sizelimit [, int timelimit [, int deref]]]]]) +/* {{{ proto resource ldap_list(resource|array link, string base_dn, string filter [, array attrs [, int attrsonly [, int sizelimit [, int timelimit [, int deref]]]]]) Single-level search */ PHP_FUNCTION(ldap_list) { @@ -835,7 +806,7 @@ } /* }}} */ -/* {{{ proto resource ldap_search(resource link, string base_dn, string filter [, array attrs [, int attrsonly [, int sizelimit [, int timelimit [, int deref]]]]]) +/* {{{ proto resource ldap_search(resource|array link, string base_dn, string filter [, array attrs [, int attrsonly [, int sizelimit [, int timelimit [, int deref]]]]]) Search LDAP tree under base_dn */ PHP_FUNCTION(ldap_search) { Modified: php/php-src/branches/PHP_5_3/ext/ldap/tests/ldap_search_error.phpt =================================================================== --- php/php-src/branches/PHP_5_3/ext/ldap/tests/ldap_search_error.phpt 2009-08-14 22:49:38 UTC (rev 287310) +++ php/php-src/branches/PHP_5_3/ext/ldap/tests/ldap_search_error.phpt 2009-08-15 00:52:31 UTC (rev 287311) @@ -45,8 +45,8 @@ Warning: ldap_search(): Search: No such object in %s on line %d bool(false) -Warning: ldap_search(): Expected Array as last element in %s on line %d -bool(false) +Warning: ldap_search() expects parameter 4 to be array, null given in %s on line %d +NULL Warning: ldap_search(): Array initialization wrong in %s on line %d bool(false) Modified: php/php-src/trunk/ext/ldap/ldap.c =================================================================== --- php/php-src/trunk/ext/ldap/ldap.c 2009-08-14 22:49:38 UTC (rev 287310) +++ php/php-src/trunk/ext/ldap/ldap.c 2009-08-15 00:52:31 UTC (rev 287311) @@ -597,60 +597,36 @@ */ static void php_ldap_do_search(INTERNAL_FUNCTION_PARAMETERS, int scope) { - zval **link, **base_dn, **filter, **attrs, **attr, **attrsonly, **sizelimit, **timelimit, **deref; - char *ldap_base_dn = NULL; - char *ldap_filter = NULL; - char **ldap_attrs = NULL; + zval *link, *base_dn, **filter, *attrs, **attr; + long attrsonly, sizelimit, timelimit, deref; + char *ldap_base_dn = NULL, *ldap_filter = NULL, **ldap_attrs = NULL; ldap_linkdata *ld = NULL; LDAPMessage *ldap_res; - int ldap_attrsonly = 0; - int ldap_sizelimit = -1; - int ldap_timelimit = -1; - int ldap_deref = -1; - int old_ldap_sizelimit = -1; - int old_ldap_timelimit = -1; - int old_ldap_deref = -1; - int num_attribs = 0; - int i, errno; - int myargcount = ZEND_NUM_ARGS(); - int free_base_dn = 0; - int ret = 1; + int ldap_attrsonly = 0, ldap_sizelimit = -1, ldap_timelimit = -1, ldap_deref = -1; + int old_ldap_sizelimit = -1, old_ldap_timelimit = -1, old_ldap_deref = -1; + int num_attribs = 0, ret = 1, i, errno, argcount = ZEND_NUM_ARGS(); - if (zend_parse_parameters(myargcount TSRMLS_CC, "ZZZ|ZZZZZ", &link, &base_dn, &filter, &attrs, &attrsonly, + if (zend_parse_parameters(argcount TSRMLS_CC, "zzZ|allll", &link, &base_dn, &filter, &attrs, &attrsonly, &sizelimit, &timelimit, &deref) == FAILURE) { return; } /* Reverse -> fall through */ - switch (myargcount) { - case 8 : - convert_to_long_ex(deref); - ldap_deref = Z_LVAL_PP(deref); - - case 7 : - convert_to_long_ex(timelimit); - ldap_timelimit = Z_LVAL_PP(timelimit); - - case 6 : - convert_to_long_ex(sizelimit); - ldap_sizelimit = Z_LVAL_PP(sizelimit); - - case 5 : - convert_to_long_ex(attrsonly); - ldap_attrsonly = Z_LVAL_PP(attrsonly); - - case 4 : - if (Z_TYPE_PP(attrs) != IS_ARRAY) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Expected Array as last element"); - ret = 0; - goto cleanup; - } - - num_attribs = zend_hash_num_elements(Z_ARRVAL_PP(attrs)); + switch (argcount) { + case 8: + ldap_deref = deref; + case 7: + ldap_timelimit = timelimit; + case 6: + ldap_sizelimit = sizelimit; + case 5: + ldap_attrsonly = attrsonly; + case 4: + num_attribs = zend_hash_num_elements(Z_ARRVAL_P(attrs)); ldap_attrs = safe_emalloc((num_attribs+1), sizeof(char *), 0); for (i = 0; i<num_attribs; i++) { - if (zend_hash_index_find(Z_ARRVAL_PP(attrs), i, (void **) &attr) != SUCCESS) { + if (zend_hash_index_find(Z_ARRVAL_P(attrs), i, (void **) &attr) != SUCCESS) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Array initialization wrong"); ret = 0; goto cleanup; @@ -661,47 +637,38 @@ ldap_attrs[i] = Z_STRVAL_PP(attr); } ldap_attrs[num_attribs] = NULL; - - case 3 : - - break; - default: - WRONG_PARAM_COUNT; - break; + break; } /* parallel search? */ - if (Z_TYPE_PP(link) == IS_ARRAY) { + if (Z_TYPE_P(link) == IS_ARRAY) { int i, nlinks, nbases, nfilters, *rcs; ldap_linkdata **lds; zval **entry, *resource; - nlinks = zend_hash_num_elements(Z_ARRVAL_PP(link)); + nlinks = zend_hash_num_elements(Z_ARRVAL_P(link)); if (nlinks == 0) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "No links in link array"); ret = 0; goto cleanup; } - if (Z_TYPE_PP(base_dn) == IS_ARRAY) { - nbases = zend_hash_num_elements(Z_ARRVAL_PP(base_dn)); + if (Z_TYPE_P(base_dn) == IS_ARRAY) { + nbases = zend_hash_num_elements(Z_ARRVAL_P(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"); ret = 0; goto cleanup; } - zend_hash_internal_pointer_reset(Z_ARRVAL_PP(base_dn)); + zend_hash_internal_pointer_reset(Z_ARRVAL_P(base_dn)); } else { nbases = 0; /* this means string, not array */ /* 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); - } else if(Z_TYPE_PP(base_dn) == IS_UNICODE){ - char *tmp = zend_unicode_to_ascii(Z_USTRVAL_PP(base_dn), Z_USTRLEN_PP(base_dn) TSRMLS_CC); - ldap_base_dn = estrdup(tmp); - efree(tmp); - free_base_dn = 1; + if (Z_TYPE_P(base_dn) == IS_STRING) { + ldap_base_dn = Z_STRVAL_P(base_dn); + } else if (Z_TYPE_P(base_dn) == IS_UNICODE) { + ldap_base_dn = zend_unicode_to_ascii(Z_USTRVAL_P(base_dn), Z_USTRLEN_P(base_dn) TSRMLS_CC); } else { ldap_base_dn = NULL; } @@ -724,9 +691,9 @@ lds = safe_emalloc(nlinks, sizeof(ldap_linkdata), 0); rcs = safe_emalloc(nlinks, sizeof(*rcs), 0); - zend_hash_internal_pointer_reset(Z_ARRVAL_PP(link)); + zend_hash_internal_pointer_reset(Z_ARRVAL_P(link)); for (i=0; i<nlinks; i++) { - zend_hash_get_current_data(Z_ARRVAL_PP(link), (void **)&entry); + zend_hash_get_current_data(Z_ARRVAL_P(link), (void **)&entry); ld = (ldap_linkdata *) zend_fetch_resource(entry TSRMLS_CC, -1, "ldap link", NULL, 1, le_link); if (ld == NULL) { @@ -734,16 +701,14 @@ goto cleanup_parallel; } if (nbases != 0) { /* base_dn an array? */ - zend_hash_get_current_data(Z_ARRVAL_PP(base_dn), (void **)&entry); - zend_hash_move_forward(Z_ARRVAL_PP(base_dn)); + zend_hash_get_current_data(Z_ARRVAL_P(base_dn), (void **)&entry); + zend_hash_move_forward(Z_ARRVAL_P(base_dn)); /* If anything else than string is passed, ldap_base_dn = NULL */ if (Z_TYPE_PP(entry) == IS_STRING) { ldap_base_dn = Z_STRVAL_PP(entry); - } else if(Z_TYPE_PP(entry) == IS_UNICODE){ - char *tmp = zend_unicode_to_ascii(Z_USTRVAL_PP(entry), Z_USTRLEN_PP(entry) TSRMLS_CC); - ldap_base_dn = estrdup(tmp); - free_base_dn = 1; + } else if (Z_TYPE_PP(entry) == IS_UNICODE) { + ldap_base_dn = zend_unicode_to_ascii(Z_USTRVAL_PP(entry), Z_USTRLEN_PP(entry) TSRMLS_CC); } else { ldap_base_dn = NULL; } @@ -760,7 +725,7 @@ /* Run the actual search */ rcs[i] = ldap_search(ld->link, ldap_base_dn, scope, ldap_filter, ldap_attrs, ldap_attrsonly); lds[i] = ld; - zend_hash_move_forward(Z_ARRVAL_PP(link)); + zend_hash_move_forward(Z_ARRVAL_P(link)); } array_init(return_value); @@ -787,16 +752,13 @@ 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); - } else if (Z_TYPE_PP(base_dn) == IS_UNICODE) { - char *tmp = zend_unicode_to_ascii(Z_USTRVAL_PP(base_dn), Z_USTRLEN_PP(base_dn) TSRMLS_CC); - ldap_base_dn = estrdup(tmp); - efree(tmp); - free_base_dn = 1; + if (Z_TYPE_P(base_dn) == IS_STRING) { + ldap_base_dn = Z_STRVAL_P(base_dn); + } else if (Z_TYPE_P(base_dn) == IS_UNICODE) { + ldap_base_dn = zend_unicode_to_ascii(Z_USTRVAL_P(base_dn), Z_USTRLEN_P(base_dn) TSRMLS_CC); } - ld = (ldap_linkdata *) zend_fetch_resource(link TSRMLS_CC, -1, "ldap link", NULL, 1, le_link); + ld = (ldap_linkdata *) zend_fetch_resource(&link TSRMLS_CC, -1, "ldap link", NULL, 1, le_link); if (ld == NULL) { ret = 0; goto cleanup; @@ -840,7 +802,7 @@ if (ldap_attrs != NULL) { efree(ldap_attrs); } - if (free_base_dn) { + if (Z_TYPE_P(base_dn) == IS_UNICODE) { efree(ldap_base_dn); } if (!ret) { @@ -849,7 +811,7 @@ } /* }}} */ -/* {{{ proto resource ldap_read(resource link, string base_dn, string filter [, array attrs [, int attrsonly [, int sizelimit [, int timelimit [, int deref]]]]]) U +/* {{{ proto resource ldap_read(resource|array link, string base_dn, string filter [, array attrs [, int attrsonly [, int sizelimit [, int timelimit [, int deref]]]]]) U Read an entry */ PHP_FUNCTION(ldap_read) { @@ -857,7 +819,7 @@ } /* }}} */ -/* {{{ proto resource ldap_list(resource link, string base_dn, string filter [, array attrs [, int attrsonly [, int sizelimit [, int timelimit [, int deref]]]]]) U +/* {{{ proto resource ldap_list(resource|array link, string base_dn, string filter [, array attrs [, int attrsonly [, int sizelimit [, int timelimit [, int deref]]]]]) U Single-level search */ PHP_FUNCTION(ldap_list) { @@ -865,7 +827,7 @@ } /* }}} */ -/* {{{ proto resource ldap_search(resource link, string base_dn, string filter [, array attrs [, int attrsonly [, int sizelimit [, int timelimit [, int deref]]]]]) U +/* {{{ proto resource ldap_search(resource|array link, string base_dn, string filter [, array attrs [, int attrsonly [, int sizelimit [, int timelimit [, int deref]]]]]) U Search LDAP tree under base_dn */ PHP_FUNCTION(ldap_search) { Modified: php/php-src/trunk/ext/ldap/tests/ldap_search_error.phpt =================================================================== --- php/php-src/trunk/ext/ldap/tests/ldap_search_error.phpt 2009-08-14 22:49:38 UTC (rev 287310) +++ php/php-src/trunk/ext/ldap/tests/ldap_search_error.phpt 2009-08-15 00:52:31 UTC (rev 287311) @@ -45,8 +45,8 @@ Warning: ldap_search(): Search: No such object in %s on line %d bool(false) -Warning: ldap_search(): Expected Array as last element in %s on line %d -bool(false) +Warning: ldap_search() expects parameter 4 to be array, null given in %s on line %d +NULL Warning: ldap_search(): Array initialization wrong in %s on line %d bool(false)
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php