]> git.ipfire.org Git - thirdparty/openldap.git/commitdiff
ITS#10045 Also check for abandon when things have settled
authorOndřej Kuzník <ondra@mistotebe.net>
Thu, 27 Apr 2023 14:24:03 +0000 (15:24 +0100)
committerQuanah Gibson-Mount <quanah@openldap.org>
Mon, 15 May 2023 17:15:11 +0000 (17:15 +0000)
servers/slapd/bconfig.c

index 027ebdcf747f931611df60f5df682a7c0864e310..49f65c678e33d83ab19a9b24d3f65e864f2999cd 100644 (file)
@@ -5749,12 +5749,21 @@ config_back_add( Operation *op, SlapReply *rs )
                }
        }
 
+       /*
+        * ITS#10045 Pre-check for abandon but be willing to handle that the
+        * operation might be abandoned while waiting for the server to pause.
+        */
        if ( op->o_abandon ) {
                rs->sr_err = SLAPD_ABANDON;
+               dopause = 0;
                goto out;
        }
        if ( slap_pause_server() < 0 )
                dopause = 0;
+       if ( op->o_abandon ) {
+               rs->sr_err = SLAPD_ABANDON;
+               goto out;
+       }
 
        ldap_pvt_thread_rdwr_wlock( &cfb->cb_rwlock );
 
@@ -5823,10 +5832,11 @@ config_back_add( Operation *op, SlapReply *rs )
 
 out2:;
        ldap_pvt_thread_rdwr_wunlock( &cfb->cb_rwlock );
+
+out:;
        if ( dopause )
                slap_unpause_server();
 
-out:;
        {       int repl = op->o_dont_replicate;
                if ( rs->sr_err == LDAP_COMPARE_TRUE ) {
                        rs->sr_text = NULL; /* Set after config_add_internal */
@@ -6332,12 +6342,21 @@ config_back_modify( Operation *op, SlapReply *rs )
        }
 
        if ( do_pause ) {
+               /*
+                * ITS#10045 Pre-check for abandon but be willing to handle that the
+                * operation might be abandoned while waiting for the server to pause.
+                */
                if ( op->o_abandon ) {
                        rs->sr_err = SLAPD_ABANDON;
+                       do_pause = 0;
                        goto out;
                }
                if ( slap_pause_server() < 0 )
                        do_pause = 0;
+               if ( op->o_abandon ) {
+                       rs->sr_err = SLAPD_ABANDON;
+                       goto out;
+               }
        }
        ldap_pvt_thread_rdwr_wlock( &cfb->cb_rwlock );
 
@@ -6384,9 +6403,9 @@ config_back_modify( Operation *op, SlapReply *rs )
        }
 
        ldap_pvt_thread_rdwr_wunlock( &cfb->cb_rwlock );
+out:
        if ( do_pause )
                slap_unpause_server();
-out:
        if ( num_ctrls ) rs->sr_ctrls = ctrls;
        send_ldap_result( op, rs );
        slap_graduate_commit_csn( op );
@@ -6544,12 +6563,21 @@ config_back_modrdn( Operation *op, SlapReply *rs )
                }
        }
 
+       /*
+        * ITS#10045 Pre-check for abandon but be willing to handle that the
+        * operation might be abandoned while waiting for the server to pause.
+        */
        if ( op->o_abandon ) {
                rs->sr_err = SLAPD_ABANDON;
+               dopause = 0;
                goto out;
        }
        if ( slap_pause_server() < 0 )
                dopause = 0;
+       if ( op->o_abandon ) {
+               rs->sr_err = SLAPD_ABANDON;
+               goto out;
+       }
 
        ldap_pvt_thread_rdwr_wlock( &cfb->cb_rwlock );
 
@@ -6633,9 +6661,9 @@ config_back_modrdn( Operation *op, SlapReply *rs )
 
        ldap_pvt_thread_rdwr_wunlock( &cfb->cb_rwlock );
 
+out:
        if ( dopause )
                slap_unpause_server();
-out:
        if ( num_ctrls ) rs->sr_ctrls = ctrls;
        send_ldap_result( op, rs );
        return rs->sr_err;
@@ -6697,6 +6725,11 @@ config_back_delete( Operation *op, SlapReply *rs )
 
                ldap_pvt_thread_rdwr_wlock( &cfb->cb_rwlock );
 
+               if ( op->o_abandon ) {
+                       rs->sr_err = SLAPD_ABANDON;
+                       goto out2;
+               }
+
                if ( ce->ce_type == Cft_Overlay ){
                        overlay_remove( ce->ce_be, (slap_overinst *)ce->ce_bi, op );
                } else if ( ce->ce_type == Cft_Misc ) {