]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
dict-sql: Fix assert-crash if trying to rollback an open set/inc transaction
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Wed, 9 Feb 2022 21:12:19 +0000 (23:12 +0200)
committeraki.tuomi <aki.tuomi@open-xchange.com>
Mon, 21 Feb 2022 11:50:32 +0000 (11:50 +0000)
Fixes:
Panic: file dict-sql.c: line 911 (sql_dict_transaction_free): assertion failed: (!array_is_created(&ctx->prev_set))

src/lib-dict-backend/dict-sql.c

index 7935b9351b71a197f7ce2a7d4e7f53347885dae1..c44330b02dffe5750e2a6bc682a729b333519a3f 100644 (file)
@@ -88,6 +88,8 @@ static struct sql_db_cache *dict_sql_db_cache;
 
 static void sql_dict_prev_inc_flush(struct sql_dict_transaction_context *ctx);
 static void sql_dict_prev_set_flush(struct sql_dict_transaction_context *ctx);
+static void sql_dict_prev_inc_free(struct sql_dict_transaction_context *ctx);
+static void sql_dict_prev_set_free(struct sql_dict_transaction_context *ctx);
 
 static int
 sql_dict_init(struct dict *driver, const char *uri,
@@ -916,8 +918,10 @@ sql_dict_transaction_init(struct dict *_dict)
 
 static void sql_dict_transaction_free(struct sql_dict_transaction_context *ctx)
 {
-       i_assert(!array_is_created(&ctx->prev_inc));
-       i_assert(!array_is_created(&ctx->prev_set));
+       if (array_is_created(&ctx->prev_inc))
+               sql_dict_prev_inc_free(ctx);
+       if (array_is_created(&ctx->prev_set))
+               sql_dict_prev_set_free(ctx);
 
        pool_unref(&ctx->inc_row_pool);
        i_free(ctx->error);