]> 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:31:36 +0000 (17:31 +0000)
servers/slapd/bconfig.c

index 52fe6ad67c694693937668f9ce9d64334c3b3ce6..15d4a6a1f9626918e88d61b0b71a0edc0dc00b26 100644 (file)
@@ -5953,12 +5953,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 );
 
@@ -6011,10 +6020,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 */
@@ -6490,12 +6500,21 @@ config_back_modify( Operation *op, SlapReply *rs )
        slap_mods_opattrs( op, &op->orm_modlist, 1 );
 
        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 );
 
@@ -6530,9 +6549,9 @@ config_back_modify( Operation *op, SlapReply *rs )
        }
 
        ldap_pvt_thread_rdwr_wunlock( &cfb->cb_rwlock );
+out:
        if ( do_pause )
                slap_unpause_server();
-out:
        send_ldap_result( op, rs );
        slap_graduate_commit_csn( op );
        return rs->sr_err;
@@ -6662,12 +6681,21 @@ config_back_modrdn( Operation *op, SlapReply *rs )
                goto out;
        }
 
+       /*
+        * 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 );
 
@@ -6737,9 +6765,9 @@ config_back_modrdn( Operation *op, SlapReply *rs )
 
        ldap_pvt_thread_rdwr_wunlock( &cfb->cb_rwlock );
 
+out:
        if ( dopause )
                slap_unpause_server();
-out:
        send_ldap_result( op, rs );
        return rs->sr_err;
 }
@@ -6774,6 +6802,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 ) {