]> git.sur5r.net Git - openldap/commitdiff
ITS#6783
authorQuanah Gibson-Mount <quanah@openldap.org>
Thu, 13 Jan 2011 20:01:27 +0000 (20:01 +0000)
committerQuanah Gibson-Mount <quanah@openldap.org>
Thu, 13 Jan 2011 20:01:27 +0000 (20:01 +0000)
CHANGES
servers/slapd/back-monitor/search.c

diff --git a/CHANGES b/CHANGES
index 3ae2fcec64dc83e912b11ebe4b4681de57bb896c..e9a5924518bae3c181e9f04d02d1df5ea0155a49 100644 (file)
--- 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)
index a1b35862bcdaf52d977e662ba5e3ebbd9d811acf..1e3ed37eef436b991fc332bf374557bc11f70ae8 100644 (file)
@@ -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;