Re: UPDATED: Patch to fix BUG: ldap_search: sizelimit exceeded, no result..
| From: | Stig Venaas | Date: | Fri, 21 Jul 2000 17:07:30 +0000 |
| Subject: | Re: UPDATED: Patch to fix BUG: ldap_search: sizelimit exceeded, no result.. | ||
| References: | 1 2 | Groups: | php.dev |
| Request: | Send a blank email to php-dev+get-25368@lists.php.net to get a copy of this message | ||
Great work. Unless Rasmus or anyone is against it, I'll add it in a
few hours.
Stig
On Thu, Jul 20, 2000 at 07:03:51PM +0300, jtaskine@hit.fi wrote:
> On Thu, 20 Jul 2000, Stig Venaas wrote:
>
> >Wouldn't it be better if we changed ldap_search into
> >int ldap_search (int link_identifier, string base_dn, string filter [, array attributes,
> >int attrsonly, int sizelimit, int timelimit, int deref])
> >
> >Unless anyone else does, I'll apply your patch and possible additions in
> >a day or two, I'm a bit busy right now.
>
> Here's the patch. I tested this with my existing ldap-things and they
> worked fine (no modifications needed to them).
>
> I could verify also that attrsonly and sizelimit parameters work.
> Dunno about timelimit and deref.
>
> --Jani
>
> Index: ldap.c
> ===================================================================
> RCS file: /repository/php4/ext/ldap/ldap.c,v
> retrieving revision 1.46
> diff -u -r1.46 ldap.c
> --- ldap.c 2000/06/27 09:28:05 1.46
> +++ ldap.c 2000/07/20 15:50:10
> @@ -450,70 +450,76 @@
>
> static void php_ldap_do_search(INTERNAL_FUNCTION_PARAMETERS, int scope)
> {
> - pval **link, **base_dn, **filter, **attrs, **attr;
> + pval **link, **base_dn, **filter, **attrs, **attr, **attrsonly, **sizelimit, **timelimit,
> **deref;
> char *ldap_base_dn, *ldap_filter;
> LDAP *ldap;
> char **ldap_attrs = NULL;
> - int attrsonly;
> + int ldap_attrsonly = 0; /* 0 = types & values , 1 = only attributes types */
> + int ldap_sizelimit = 0; /* LDAP_NO_LIMIT 0 */
> + int ldap_timelimit = 0; /* 0 = no timelimit? */
> + int ldap_deref = 0; /* LDAP_DEREF_NEVER 0, LDAP_DEREF_SEARCHING 1, LDAP_DEREF_FINDING 2,
> LDAP_DEREF_ALWAYS 3 */
> LDAPMessage *ldap_result;
> - int num_attribs=0, i;
> + int num_attribs = 0;
> + int i, errno;
> + int myargcount = ZEND_NUM_ARGS();
> LDAPLS_FETCH();
> +
> + if (myargcount < 3 || myargcount > 8 || zend_get_parameters_ex(myargcount, &link,
> &base_dn, &filter, &attrs, &attrsonly, &sizelimit, &timelimit, &deref)
> == FAILURE) {
> + WRONG_PARAM_COUNT;
> + }
>
> - switch(ZEND_NUM_ARGS()) {
> - case 3 :
> - if (zend_get_parameters_ex(3, &link, &base_dn,&filter) == FAILURE) {
> - WRONG_PARAM_COUNT;
> - }
> + /* Reverse -> fall through */
> + switch(myargcount) {
> + case 8 :
> + convert_to_long_ex(deref);
> + ldap_deref = (*deref)->value.lval;
>
> - convert_to_string_ex(base_dn);
> - convert_to_string_ex(filter);
> + case 7 :
> + convert_to_long_ex(timelimit);
> + ldap_timelimit = (*timelimit)->value.lval;
>
> - ldap_base_dn = (*base_dn)->value.str.val;
> - ldap_filter = (*filter)->value.str.val;
> + case 6 :
> + convert_to_long_ex(sizelimit);
> + ldap_sizelimit = (*sizelimit)->value.lval;
>
> - break;
> + case 5 :
> + convert_to_long_ex(attrsonly);
> + ldap_attrsonly = (*attrsonly)->value.lval;
>
> case 4 :
> - if (zend_get_parameters_ex(4, &link, &base_dn,&filter, &attrs) == FAILURE)
> {
> - WRONG_PARAM_COUNT;
> - }
> -
> if ((*attrs)->type != IS_ARRAY) {
> php_error(E_WARNING, "LDAP: Expected Array as last element");
> RETURN_FALSE;
> }
>
> - convert_to_string_ex(base_dn);
> - convert_to_string_ex(filter);
> -
> - ldap_base_dn = (*base_dn)->value.str.val;
> - ldap_filter = (*filter)->value.str.val;
> -
> num_attribs = zend_hash_num_elements((*attrs)->value.ht);
> if ((ldap_attrs = emalloc((num_attribs+1) * sizeof(char *))) == NULL) {
> php_error(E_WARNING, "LDAP: Could not allocate memory");
> RETURN_FALSE;
> - return;
> }
>
> for(i=0; i<num_attribs; i++) {
> - if(zend_hash_index_find((*attrs)->value.ht, i, (void **) &attr) == FAILURE)
> -{
> + if(zend_hash_index_find((*attrs)->value.ht, i, (void **) &attr) == FAILURE) {
> php_error(E_WARNING, "LDAP: Array initialization wrong");
> RETURN_FALSE;
> - return;
> }
> +
> SEPARATE_ZVAL(attr);
> convert_to_string_ex(attr);
> ldap_attrs[i] = (*attr)->value.str.val;
> }
> ldap_attrs[num_attribs] = NULL;
> -
> - break;
> +
> + case 3 :
> + convert_to_string_ex(base_dn);
> + convert_to_string_ex(filter);
> + ldap_base_dn = (*base_dn)->value.str.val;
> + ldap_filter = (*filter)->value.str.val;
> + break;
>
> default:
> WRONG_PARAM_COUNT;
> - break;
> + break;
> }
>
> /* fix to make null base_dn's work */
> @@ -523,33 +529,48 @@
>
> ldap = _get_ldap_link(link);
> if (ldap == NULL) RETURN_FALSE;
> +
> + /* sizelimit */
> + if(ldap_sizelimit > 0) {
> + ldap->ld_sizelimit = ldap_sizelimit;
> + }
>
> - /* Is it useful to only get the attributes ? */
> - attrsonly = 0;
> + /* timelimit */
> + if(ldap_timelimit > 0) {
> + ldap->ld_timelimit = ldap_timelimit;
> + }
>
> - /* We can possibly add the timeout value also */
> + /* deref */
> + if(ldap_deref > 0) {
> + ldap->ld_deref = ldap_deref;
> + }
> +
> + /* Run the actual search */
> + errno = ldap_search_s(ldap, ldap_base_dn, scope, ldap_filter, ldap_attrs, ldap_attrsonly,
> &ldap_result);
> +
> + if (ldap_attrs != NULL) {
> + efree(ldap_attrs);
> + }
>
> - if (ldap_search_s(ldap, ldap_base_dn, scope, ldap_filter, ldap_attrs, attrsonly,
> &ldap_result) != LDAP_SUCCESS) {
> + if (errno != LDAP_SUCCESS && errno != LDAP_SIZELIMIT_EXCEEDED) {
> #if !HAVE_NSLDAP
> #if LDAP_API_VERSION > 2000
> - php_error(E_WARNING,"LDAP: Unable to perform the search:
> %s",ldap_err2string(ldap_get_lderrno(ldap,NULL,NULL)));
> + php_error(E_WARNING,"LDAP: Unable to perform the search:
> %s",ldap_err2string(ldap_get_lderrno(ldap,NULL,NULL)));
> #else
> php_error(E_WARNING, "LDAP: Unable to perform the search: %s",
> ldap_err2string(ldap->ld_errno));
> #endif
> #endif
> - RETVAL_FALSE;
> - } else {
> + RETVAL_FALSE;
> + } else {
> + if (errno == LDAP_SIZELIMIT_EXCEEDED) {
> + php_error(E_WARNING,"LDAP: Partial search results returned: Sizelimit
> exceeded.");
> + }
> RETVAL_LONG(zend_list_insert(ldap_result, le_result));
> }
> -
> - if (ldap_attrs != NULL) {
> - /* for(i=0; i<num_attribs; i++) efree(ldap_attrs[i]); */
> - efree(ldap_attrs);
> - }
> - return;
> }
> +
>
> -/* {{{ proto int ldap_read(int link, string base_dn, string filter [, array attributes])
> +/* {{{ proto int ldap_read(int link, string base_dn, string filter [, array attrs [, int
> attrsonly [, int sizelimit [, int timelimit [, int deref]]]]] )
> Read an entry */
> PHP_FUNCTION(ldap_read)
> {
> @@ -557,7 +578,8 @@
> }
> /* }}} */
>
> -/* {{{ proto int ldap_list(int link, string base_dn, string filter [, array attributes])
> +
> +/* {{{ proto int ldap_list(int link, string base_dn, string filter [, array attrs [, int
> attrsonly [, int sizelimit [, int timelimit [, int deref]]]]] )
> Single-level search */
> PHP_FUNCTION(ldap_list)
> {
> @@ -566,7 +588,7 @@
> /* }}} */
>
>
> -/* {{{ proto int ldap_search(int link, string base_dn, string filter [, array attributes])
> +/* {{{ proto int ldap_search(int 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)
> {
> @@ -574,6 +596,7 @@
> }
> /* }}} */
>
> +
> /* {{{ proto int ldap_free_result(int result)
> Free result memory */
> PHP_FUNCTION(ldap_free_result)
> @@ -1292,7 +1315,6 @@
> #else
> RETURN_LONG( ldap_get_lderrno(ldap, NULL, NULL) );
> #endif
> - RETURN_LONG(0);
> }
> /* }}} */
>
>