From 6b1a93d6a5be1e622d5922b9f0fc6c6253bdf331 Mon Sep 17 00:00:00 2001
From: Quanah Gibson-Mount <quanah@openldap.org>
Date: Fri, 30 Oct 2009 19:35:18 +0000
Subject: [PATCH] ITS#6341

---
 CHANGES                        |  1 +
 servers/slapd/back-bdb/cache.c | 12 ++++++++----
 2 files changed, 9 insertions(+), 4 deletions(-)

diff --git a/CHANGES b/CHANGES
index 15f297e593..d4da101c95 100644
--- a/CHANGES
+++ b/CHANGES
@@ -4,6 +4,7 @@ OpenLDAP 2.4.20 Engineering
 	Fixed libldap uninitialized return value (ITS#6355)
 	Fixed slapd debug handling of LDAP_DEBUG_ANY (ITS#6324)
 	Fixed slapd termination for one level dns (ITS#6338)
+	Fixed slapd-bdb cache corruption (ITS#6341)
 	Fixed slapd-ldap leak (ITS#6326)
 	Fixed slapd-relay bind segfault (ITS#6337)
 	Fixed slapo-memberof operational attr updates (ITS#6329)
diff --git a/servers/slapd/back-bdb/cache.c b/servers/slapd/back-bdb/cache.c
index a6ba2b9b36..bab34701b6 100644
--- a/servers/slapd/back-bdb/cache.c
+++ b/servers/slapd/back-bdb/cache.c
@@ -106,10 +106,14 @@ bdb_cache_entryinfo_free( Cache *cache, EntryInfo *ei )
 }
 
 #define LRU_DEL( c, e ) do { \
-	if ( e == (c)->c_lruhead ) (c)->c_lruhead = e->bei_lruprev; \
-	if ( e == (c)->c_lrutail ) (c)->c_lrutail = e->bei_lruprev; \
-	e->bei_lrunext->bei_lruprev = e->bei_lruprev; \
-	e->bei_lruprev->bei_lrunext = e->bei_lrunext; \
+	if ( e == e->bei_lruprev ) { \
+		(c)->c_lruhead = (c)->c_lrutail = NULL; \
+	} else { \	
+		if ( e == (c)->c_lruhead ) (c)->c_lruhead = e->bei_lruprev; \
+		if ( e == (c)->c_lrutail ) (c)->c_lrutail = e->bei_lruprev; \
+		e->bei_lrunext->bei_lruprev = e->bei_lruprev; \
+		e->bei_lruprev->bei_lrunext = e->bei_lrunext; \
+	} \
 	e->bei_lruprev = NULL; \
 } while ( 0 )
 
-- 
GitLab