diff --git a/libraries/libldap/result.c b/libraries/libldap/result.c index 03a2677fe9166552be3b7a8a8ed0bb1cf0cc6881..3aa8a54835900b80b9af5afdacb4507683f20189 100644 --- a/libraries/libldap/result.c +++ b/libraries/libldap/result.c @@ -612,9 +612,6 @@ nextresp2: if( LDAP_BOOL_GET(&ld->ld_options, LDAP_BOOL_REFERRALS) || (lr->lr_parent != NULL) ) { - /* Assume referral not chased and return it to app */ - v3ref = V3REF_TOAPP; - /* Get the referral list */ if( ber_scanf( &tmpber, "{v}", &refs) == LBER_ERROR) { rc = LDAP_DECODING_ERROR; @@ -630,11 +627,15 @@ nextresp2: 0, &lr->lr_res_error, &hadref ); lr->lr_status = LDAP_REQST_COMPLETED; Debug( LDAP_DEBUG_TRACE, - "read1msg: referral chased, mark request completed, ld %p msgid %d\n", - (void *)ld, lr->lr_msgid, 0); + "read1msg: referral %s chased, " + "mark request completed, ld %p msgid %d\n", + hadref ? "" : "not", + (void *)ld, lr->lr_msgid); if( refer_cnt > 0) { /* Referral successfully chased */ v3ref = V3REF_SUCCESS; + } else { + refer_cnt = 0; } } } @@ -648,26 +649,6 @@ nextresp2: LDAP_FREE( lr->lr_res_error ); lr->lr_res_error = NULL; } - - /* Since it's not a SearchReference, it must be a - * result. Since we're not chasing the referral, - * this request is done. - */ - if ( v3ref == V3REF_TOAPP ) { - lr->lr_status = LDAP_REQST_COMPLETED; - Debug( LDAP_DEBUG_TRACE, - "request done: ld %p msgid %d, " - "referral returned to app\n", - (void *)ld, lr->lr_msgid, 0); -#ifdef LDAP_R_COMPILE - ldap_pvt_thread_mutex_lock( &ld->ld_req_mutex ); -#endif - ldap_free_request( ld, lr ); -#ifdef LDAP_R_COMPILE - ldap_pvt_thread_mutex_unlock( &ld->ld_req_mutex ); -#endif - lr = NULL; - } } } } @@ -676,11 +657,13 @@ nextresp2: * go through the following code. This code also chases V2 referrals * and checks if all referrals have been chased. */ - if ( (tag != LDAP_RES_SEARCH_ENTRY) && (v3ref != V3REF_TOAPP) && - (tag != LDAP_RES_INTERMEDIATE )) + if ( tag != LDAP_RES_SEARCH_ENTRY && + tag != LDAP_RES_SEARCH_REFERENCE && + tag != LDAP_RES_INTERMEDIATE ) { /* For a v3 search referral/reference, only come here if already chased it */ if ( ld->ld_version >= LDAP_VERSION2 && + v3ref != V3REF_TOAPP && ( lr->lr_parent != NULL || LDAP_BOOL_GET(&ld->ld_options, LDAP_BOOL_REFERRALS) ) ) {