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_5_15~26 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=58dd1467ca452f9b609c56513433a509eb1e411d;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 52fe6ad67c..15d4a6a1f9 100644 --- a/servers/slapd/bconfig.c +++ b/servers/slapd/bconfig.c @@ -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 ) {