From e0a6b69245d9ec634b506e2a7d28ace91198812a Mon Sep 17 00:00:00 2001
From: Quanah Gibson-Mount <quanah@openldap.org>
Date: Thu, 13 Aug 2009 02:33:18 +0000
Subject: [PATCH] ITS#6172

---
 CHANGES                           |  1 +
 servers/slapd/back-sql/entry-id.c | 10 +++-------
 servers/slapd/entry.c             | 17 +++++++++++------
 servers/slapd/proto-slap.h        |  1 +
 4 files changed, 16 insertions(+), 13 deletions(-)

diff --git a/CHANGES b/CHANGES
index 5d3f951d04..b27502c447 100644
--- a/CHANGES
+++ b/CHANGES
@@ -15,6 +15,7 @@ OpenLDAP 2.4.18 Engineering
 	Fixed slapd-ndb startup (ITS#6203)
 	Fixed slapd-relay various issues (ITS#6133)
 	Fixed slapd-relay response/cleanup callback mismatch (ITS#6154)
+	Fixed slapd-sql with baseObject query (ITS#6172)
 	Fixed slapd-sql with empty attribute (ITS#6163)
 	Added slapo-pcache olcProxyCacheOffline (ITS#6152)
 	Fixed slapo-unique filter matching (ITS#6077)
diff --git a/servers/slapd/back-sql/entry-id.c b/servers/slapd/back-sql/entry-id.c
index e1351b9967..26f6ced56f 100644
--- a/servers/slapd/back-sql/entry-id.c
+++ b/servers/slapd/back-sql/entry-id.c
@@ -934,15 +934,11 @@ backsql_id2entry( backsql_srch_info *bsi, backsql_entryID *eid )
 	memset( bsi->bsi_e, 0, sizeof( Entry ) );
 
 	if ( bi->sql_baseObject && BACKSQL_IS_BASEOBJECT_ID( &eid->eid_id ) ) {
-		Entry	*e;
-
-		e = entry_dup( bi->sql_baseObject );
-		if ( e == NULL ) {
-			return LDAP_NO_MEMORY;
+		rc = entry_dup_to( bi->sql_baseObject, bsi->bsi_e );
+		if ( rc != LDAP_SUCCESS ) {
+			return rc;
 		}
 			
-		*bsi->bsi_e = *e;
-		free( e );
 		goto done;
 	}
 
diff --git a/servers/slapd/entry.c b/servers/slapd/entry.c
index ff2b3574a8..fcf6cb02a4 100644
--- a/servers/slapd/entry.c
+++ b/servers/slapd/entry.c
@@ -936,17 +936,22 @@ int entry_decode(EntryHeader *eh, Entry **e)
 	return 0;
 }
 
+int entry_dup_to( Entry *source, Entry *dest )
+{
+	dest->e_id = source->e_id;
+	ber_dupbv( &dest->e_name, &source->e_name );
+	ber_dupbv( &dest->e_nname, &source->e_nname );
+	dest->e_attrs = attrs_dup( source->e_attrs );
+	dest->e_ocflags = source->e_ocflags;
+	return LDAP_SUCCESS;
+}
+
 Entry *entry_dup( Entry *e )
 {
 	Entry *ret;
 
 	ret = entry_alloc();
-
-	ret->e_id = e->e_id;
-	ber_dupbv( &ret->e_name, &e->e_name );
-	ber_dupbv( &ret->e_nname, &e->e_nname );
-	ret->e_attrs = attrs_dup( e->e_attrs );
-	ret->e_ocflags = e->e_ocflags;
+	entry_dup_to(e, ret);
 
 	return ret;
 }
diff --git a/servers/slapd/proto-slap.h b/servers/slapd/proto-slap.h
index 6e962d2ebb..f9cb9e9ac7 100644
--- a/servers/slapd/proto-slap.h
+++ b/servers/slapd/proto-slap.h
@@ -991,6 +991,7 @@ LDAP_SLAPD_F (int) entry_cmp LDAP_P(( Entry *a, Entry *b ));
 LDAP_SLAPD_F (int) entry_dn_cmp LDAP_P(( const void *v_a, const void *v_b ));
 LDAP_SLAPD_F (int) entry_id_cmp LDAP_P(( const void *v_a, const void *v_b ));
 LDAP_SLAPD_F (Entry *) entry_dup LDAP_P(( Entry *e ));
+LDAP_SLAPD_F (int) entry_dup_to LDAP_P(( Entry *src, Entry *dest ));
 LDAP_SLAPD_F (Entry *) entry_dup_bv LDAP_P(( Entry *e ));
 LDAP_SLAPD_F (Entry *) entry_alloc LDAP_P((void));
 LDAP_SLAPD_F (int) entry_prealloc LDAP_P((int num));
-- 
GitLab