From: Ondřej Kuzník Date: Thu, 27 Apr 2023 14:24:03 +0000 (+0100) Subject: ITS#10045 Also check for abandon when things have settled X-Git-Tag: OPENLDAP_REL_ENG_2_6_5~30 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=e79ccbee89f402f466912715c001a35c0bb74d99;p=thirdparty%2Fopenldap.git ITS#10045 Also check for abandon when things have settled --- diff --git a/servers/slapd/bconfig.c b/servers/slapd/bconfig.c index 027ebdcf74..49f65c678e 100644 --- a/servers/slapd/bconfig.c +++ b/servers/slapd/bconfig.c @@ -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 ) {