diff --git a/CHANGES b/CHANGES index 15f297e59378ca64e473463e1fc1356c7418a7df..d4da101c951432eeae7ca583109115165c762de8 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 a6ba2b9b369dddd2ce459d10f4c7af88115edab9..bab34701b6d098069621dc9d009ec17c65a69a66 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 )