--- ldap-int.h.orig	Tue Oct 10 15:38:39 2000
+++ ldap-int.h	Tue Oct 10 15:38:57 2000
@@ -440,7 +440,7 @@
 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 );
 
 /*
--- result.c.orig	Tue Oct 10 15:32:19 2000
+++ result.c	Tue Oct 10 15:37:58 2000
@@ -431,7 +431,7 @@
 				} 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 @@
 							 * 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",
--- request.c.orig	Tue Oct 10 15:33:55 2000
+++ request.c	Tue Oct 10 15:37:10 2000
@@ -575,13 +575,14 @@
  *  (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 @@
 		 * 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;
