]> 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>
Thu, 27 Apr 2023 19:37:02 +0000 (19:37 +0000)
servers/slapd/bconfig.c

index 067af3ec7698da6c2c8a2952d03cdb3dc0869c05..51e25d967cec0743f0ccb8b5833a113bf60d2bb0 100644 (file)
@@ -5746,12 +5746,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 );
 
@@ -5820,10 +5829,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 */
@@ -6329,12 +6339,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 );
 
@@ -6381,9 +6400,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 );
@@ -6541,12 +6560,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 );
 
@@ -6630,9 +6658,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;
@@ -6694,6 +6722,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 ) {