diff --git a/libraries/libldap/ldap-int.h b/libraries/libldap/ldap-int.h index 14152a939f..c6978b8003 100644 --- a/libraries/libldap/ldap-int.h +++ b/libraries/libldap/ldap-int.h @@ -440,7 +440,7 @@ LDAP_F (void) ldap_free_connection( LDAP *ld, LDAPConn *lc, int force, int unbin LDAP_F (void) ldap_dump_connection( LDAP *ld, LDAPConn *lconns, int all ); LDAP_F (void) ldap_dump_requests_and_responses( LDAP *ld ); LDAP_F (int) ldap_chase_referrals( LDAP *ld, LDAPRequest *lr, char **errstrp, int *hadrefp ); -LDAP_F (int) ldap_chase_v3referrals( LDAP *ld, LDAPRequest *lr, char **refs, char **referralsp, int *hadrefp ); +LDAP_F (int) ldap_chase_v3referrals( LDAP *ld, LDAPRequest *lr, char **refs, int sref, char **referralsp, int *hadrefp ); LDAP_F (int) ldap_append_referral( LDAP *ld, char **referralsp, char *s ); /* diff --git a/libraries/libldap/request.c b/libraries/libldap/request.c index f069eae76b..99d312580c 100644 --- a/libraries/libldap/request.c +++ b/libraries/libldap/request.c @@ -575,13 +575,14 @@ ldap_free_request( LDAP *ld, LDAPRequest *lr ) * (IN) lr = LDAP Request structure * (IN) refs = array of pointers to referral strings that we will chase * The array will be free'd by this function when no longer needed + * (IN) sref != 0 if following search reference * (OUT) errstrp = Place to return a string of referrals which could not be followed * (OUT) hadrefp = 1 if sucessfully followed referral * * Return value - number of referrals followed */ int -ldap_chase_v3referrals( LDAP *ld, LDAPRequest *lr, char **refs, char **errstrp, int *hadrefp ) +ldap_chase_v3referrals( LDAP *ld, LDAPRequest *lr, char **refs, int sref, char **errstrp, int *hadrefp ) { char *unfollowed; int unfollowedcnt = 0; @@ -687,6 +688,11 @@ ldap_chase_v3referrals( LDAP *ld, LDAPRequest *lr, char **refs, char **errstrp, * Note: In the future we also need to replace the filter if one * was provided with the search reference */ + + /* For references we don't want old dn if new dn empty */ + if ( sref && srv->lud_dn == NULL ) + srv->lud_dn = LDAP_STRDUP( "" ); + if (( ber = re_encode_request( ld, origreq->lr_ber, ++ld->ld_msgid, &srv->lud_dn, &rinfo.ri_request )) == NULL ) { ld->ld_errno = LDAP_ENCODING_ERROR; diff --git a/libraries/libldap/result.c b/libraries/libldap/result.c index fb47ab1ae5..3b2a081220 100644 --- a/libraries/libldap/result.c +++ b/libraries/libldap/result.c @@ -431,7 +431,7 @@ try_read1msg( } else { /* Note: refs arrary is freed by ldap_chase_v3referrals */ refer_cnt = ldap_chase_v3referrals( ld, lr, refs, - &lr->lr_res_error, &hadref ); + 1, &lr->lr_res_error, &hadref ); if ( refer_cnt > 0 ) { /* sucessfully chased reference */ /* If haven't got end search, set chasing referrals */ if( lr->lr_status != LDAP_REQST_COMPLETED) { @@ -470,7 +470,7 @@ try_read1msg( * Note: refs arrary is freed by ldap_chase_v3referrals */ refer_cnt = ldap_chase_v3referrals( ld, lr, refs, - &lr->lr_res_error, &hadref ); + 0, &lr->lr_res_error, &hadref ); lr->lr_status = LDAP_REQST_COMPLETED; Debug( LDAP_DEBUG_TRACE, "read1msg: referral chased, mark request completed, id = %d\n",