From f7f5045f2a5a4f1b09bb8f0502bebaf9e76a220b Mon Sep 17 00:00:00 2001 From: Quanah Gibson-Mount <quanah@openldap.org> Date: Thu, 13 Jan 2011 20:01:27 +0000 Subject: [PATCH] ITS#6783 --- CHANGES | 1 + servers/slapd/back-monitor/search.c | 41 +++++++++++------------------ 2 files changed, 17 insertions(+), 25 deletions(-) diff --git a/CHANGES b/CHANGES index 3ae2fcec64..e9a5924518 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 a1b35862bc..1e3ed37eef 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; -- GitLab