diff --git a/CHANGES b/CHANGES index 3ae2fcec64dc83e912b11ebe4b4681de57bb896c..e9a5924518bae3c181e9f04d02d1df5ea0155a49 100644 --- a/CHANGES +++ b/CHANGES @@ -74,6 +74,7 @@ OpenLDAP 2.4.24 Engineering Fixed slapd-meta with SASL/EXTERNAL (ITS#6642) Fixed slapd-meta matchedDN return code (ITS#6774) Fixed slapd-monitor hasSubordinates generation (ITS#6712) + Fixed slapd-monitor abandon processing (ITS#6783) Fixed slapd-sql with null objectClass (ITS#6616) Fixed slapd-sql hasSubordinates generation (ITS#6712) Fixed slapo-accesslog with controls (ITS#6652) diff --git a/servers/slapd/back-monitor/search.c b/servers/slapd/back-monitor/search.c index a1b35862bcdaf52d977e662ba5e3ebbd9d811acf..1e3ed37eef436b991fc332bf374557bc11f70ae8 100644 --- a/servers/slapd/back-monitor/search.c +++ b/servers/slapd/back-monitor/search.c @@ -60,7 +60,7 @@ monitor_send_children( if ( e == NULL ) { return LDAP_SUCCESS; } - + /* volatile entries */ } else { /* if no persistent, return only volatile */ @@ -87,47 +87,41 @@ monitor_send_children( for ( monitor_cache_lock( e ); e != NULL; ) { monitor_entry_update( op, rs, e ); - if ( op->o_abandon ) { - /* FIXME: may leak generated children */ - if ( nonvolatile == 0 ) { - for ( e_tmp = e; e_tmp != NULL; ) { - mp = ( monitor_entry_t * )e_tmp->e_private; - e = e_tmp; - e_tmp = mp->mp_next; - monitor_cache_release( mi, e ); - - if ( e_tmp == e_nonvolatile ) { - break; - } - } + if ( e == e_nonvolatile ) + nonvolatile = 1; - } else { - monitor_cache_release( mi, e ); - } + mp = ( monitor_entry_t * )e->e_private; + e_tmp = mp->mp_next; - return SLAPD_ABANDON; + if ( op->o_abandon ) { + monitor_cache_release( mi, e ); + rc = SLAPD_ABANDON; + goto freeout; } - + rc = test_filter( op, e, op->oq_search.rs_filter ); if ( rc == LDAP_COMPARE_TRUE ) { rs->sr_entry = e; rs->sr_flags = 0; rc = send_search_entry( op, rs ); rs->sr_entry = NULL; + if ( rc ) { + monitor_cache_release( mi, e ); + goto freeout; + } } - mp = ( monitor_entry_t * )e->e_private; - e_tmp = mp->mp_next; - if ( sub ) { rc = monitor_send_children( op, rs, e, sub ); if ( rc ) { +freeout: /* FIXME: may leak generated children */ if ( nonvolatile == 0 ) { for ( ; e_tmp != NULL; ) { mp = ( monitor_entry_t * )e_tmp->e_private; e = e_tmp; e_tmp = mp->mp_next; + monitor_cache_lock( e ); monitor_cache_release( mi, e ); if ( e_tmp == e_nonvolatile ) { @@ -150,9 +144,6 @@ monitor_send_children( } e = e_tmp; - if ( e == e_nonvolatile ) { - nonvolatile = 1; - } } return LDAP_SUCCESS;