From c7f4a5eb2805676c48ccdee9210f80fabea5d06d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Kuzn=C3=ADk?= Date: Tue, 8 Jun 2021 15:26:43 +0100 Subject: [PATCH] ITS#7215 Allow cleanups/commits to fail (once) Some config changes need to be prepared at entry modification time and then checked/committed at the end. Such a check can fail, so we need to do this early enough and also commit the opposite change during a revert step. The assumption is that the original version is consistent and bconfig can accurately reconstruct it, so the revert cleanups will not fail and so all of them get to be run. We set ca->reply.err so that the cleanups can be made aware and comply with this assumption. --- servers/slapd/bconfig.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/servers/slapd/bconfig.c b/servers/slapd/bconfig.c index 0a1a3593b0..ca4e76cc7a 100644 --- a/servers/slapd/bconfig.c +++ b/servers/slapd/bconfig.c @@ -5835,6 +5835,7 @@ done: } else if ( coptr->co_type == Cft_Schema ) { schema_destroy_one( ca, colst, nocs, last ); } else if ( ca->num_cleanups ) { + ca->reply.err = rc; config_run_cleanup( ca ); } } @@ -6327,6 +6328,11 @@ config_modify_internal( CfEntryInfo *ce, Operation *op, SlapReply *rs, } } + /* Apply pending changes */ + if ( rc == LDAP_SUCCESS && ca->num_cleanups ) { + rc = config_run_cleanup( ca ); + } + out: /* Undo for a failed operation */ if ( rc != LDAP_SUCCESS ) { @@ -6371,14 +6377,12 @@ out: } } } + if ( ca->num_cleanups ) { + ca->reply.err = rc; + config_run_cleanup( ca ); + } ca->reply = msg; } - - if ( ca->num_cleanups ) { - i = config_run_cleanup( ca ); - if (rc == LDAP_SUCCESS) - rc = i; - } out_noop: if ( rc == LDAP_SUCCESS ) { attrs_free( save_attrs );