]> git.sur5r.net Git - openldap/commitdiff
ITS#2894 - search refs that are the immediate result of another search
authorHoward Chu <hyc@openldap.org>
Sun, 25 Jan 2004 10:30:10 +0000 (10:30 +0000)
committerHoward Chu <hyc@openldap.org>
Sun, 25 Jan 2004 10:30:10 +0000 (10:30 +0000)
ref are associated with the parent req instead of the original req, to
prevent infinite loops.

libraries/libldap/request.c

index 237a6eefff542c4d79512c66ddc4732be9ab48b0..b289bfcb655506db9dfda03ead490632afe2384e 100644 (file)
@@ -725,6 +725,7 @@ ldap_chase_v3referrals( LDAP *ld, LDAPRequest *lr, char **refs, int sref, char *
        char            **refarray = NULL;
        LDAPConn        *lc;
        int                      rc, count, i, j, id;
+       int                      parent_was_reference;
        LDAPreqinfo  rinfo;
 
        ld->ld_errno = LDAP_SUCCESS;    /* optimistic */
@@ -760,6 +761,11 @@ ldap_chase_v3referrals( LDAP *ld, LDAPRequest *lr, char **refs, int sref, char *
                goto done;
        }
 
+       /* check if parent request was a search reference */
+       parent_was_reference = ( lr->lr_parent &&
+               lr->lr_parent->lr_res_msgtype == LDAP_RES_SEARCH_REFERENCE ) ?
+               1 : 0;
+               
        /* find original request */
        for ( origreq = lr;
                origreq->lr_parent != NULL;
@@ -890,7 +896,8 @@ ldap_chase_v3referrals( LDAP *ld, LDAPRequest *lr, char **refs, int sref, char *
                ldap_pvt_thread_mutex_lock( &ld->ld_req_mutex );
 #endif
                rc = ldap_send_server_request( ld, ber, id,
-                       origreq, srv, NULL, &rinfo );
+                       (sref && !parent_was_reference) ? origreq : lr,
+                       srv, NULL, &rinfo );
 #ifdef LDAP_R_COMPILE
                ldap_pvt_thread_mutex_unlock( &ld->ld_req_mutex );
 #endif