From 0d0ae8a8907afa9a0dd792dd56957fa6006270ea Mon Sep 17 00:00:00 2001
From: Kurt Zeilenga <kurt@openldap.org>
Date: Tue, 16 May 2006 22:39:42 +0000
Subject: [PATCH] ITS#4450 fix from head

---
 servers/slapd/back-ldap/extended.c | 16 ++++++++++------
 servers/slapd/back-ldap/search.c   |  9 ++++++---
 2 files changed, 16 insertions(+), 9 deletions(-)

diff --git a/servers/slapd/back-ldap/extended.c b/servers/slapd/back-ldap/extended.c
index e0537e870f..c4f43f8a4c 100644
--- a/servers/slapd/back-ldap/extended.c
+++ b/servers/slapd/back-ldap/extended.c
@@ -112,6 +112,7 @@ ldap_back_exop_passwd(
 	ber_int_t	msgid;
 	int		rc, isproxy;
 	int		do_retry = 1;
+	char *text = NULL;
 
 	lc = ldap_back_getconn( op, rs, LDAP_BACK_SENDERR );
 	if ( !lc || !ldap_back_dobind( lc, op, rs, LDAP_BACK_SENDERR ) ) {
@@ -140,7 +141,7 @@ retry:
 			 */
 			rc = ldap_parse_result( lc->lc_ld, res, &rs->sr_err,
 					(char **)&rs->sr_matched,
-					(char **)&rs->sr_text,
+					&text,
 					NULL, NULL, 0 );
 
 			if ( rc == LDAP_SUCCESS ) {
@@ -180,6 +181,7 @@ retry:
 				goto retry;
 			}
 		}
+		if ( text ) rs->sr_text = text;
 		send_ldap_extended( op, rs );
 		/* otherwise frontend resends result */
 		rc = rs->sr_err = SLAPD_ABANDON;
@@ -191,8 +193,8 @@ retry:
 		rs->sr_matched = NULL;
 	}
 
-	if ( rs->sr_text ) {
-		free( (char *)rs->sr_text );
+	if ( text ) {
+		free( text );
 		rs->sr_text = NULL;
 	}
 
@@ -213,6 +215,7 @@ ldap_back_exop_generic(
 	ber_int_t	msgid;
 	int		rc;
 	int		do_retry = 1;
+	char *text = NULL;
 
 	lc = ldap_back_getconn( op, rs, LDAP_BACK_SENDERR );
 	if ( !lc || !ldap_back_dobind( lc, op, rs, LDAP_BACK_SENDERR ) ) {
@@ -238,7 +241,7 @@ retry:
 			 */
 			rc = ldap_parse_result( lc->lc_ld, res, &rs->sr_err,
 					(char **)&rs->sr_matched,
-					(char **)&rs->sr_text,
+					text,
 					NULL, NULL, 0 );
 			if ( rc == LDAP_SUCCESS ) {
 				if ( rs->sr_err == LDAP_SUCCESS ) {
@@ -264,6 +267,7 @@ retry:
 				goto retry;
 			}
 		}
+		if ( text ) rs->sr_text = text;
 		send_ldap_extended( op, rs );
 		/* otherwise frontend resends result */
 		rc = rs->sr_err = SLAPD_ABANDON;
@@ -275,8 +279,8 @@ retry:
 		rs->sr_matched = NULL;
 	}
 
-	if ( rs->sr_text ) {
-		free( (char *)rs->sr_text );
+	if ( text ) {
+		free( text );
 		rs->sr_text = NULL;
 	}
 
diff --git a/servers/slapd/back-ldap/search.c b/servers/slapd/back-ldap/search.c
index de4180e65a..dbe612d549 100644
--- a/servers/slapd/back-ldap/search.c
+++ b/servers/slapd/back-ldap/search.c
@@ -375,16 +375,19 @@ retry:
 			}
 
 		} else {
-			char		**references = NULL;
+			char		**references = NULL, *err = NULL;
 
 			rc = ldap_parse_result( lc->lc_ld, res, &rs->sr_err,
-					&match.bv_val, (char **)&rs->sr_text,
+					&match.bv_val, &err,
 					&references, &rs->sr_ctrls, 1 );
-			freetext = 1;
 			if ( rc != LDAP_SUCCESS ) {
 				rs->sr_err = rc;
 			}
 			rs->sr_err = slap_map_api2result( rs );
+			if ( err ) {
+				rs->sr_text = err;
+				freetext = 1;
+			}
 
 			if ( references && references[ 0 ] && references[ 0 ][ 0 ] ) {
 				int	cnt;
-- 
GitLab