From d31af56e9a7279d20412d48c33bbd47f44091587 Mon Sep 17 00:00:00 2001 From: Timo Sirainen Date: Wed, 9 Feb 2022 23:12:19 +0200 Subject: [PATCH] dict-sql: Fix assert-crash if trying to rollback an open set/inc transaction 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 | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/lib-dict-backend/dict-sql.c b/src/lib-dict-backend/dict-sql.c index 7935b9351b..c44330b02d 100644 --- a/src/lib-dict-backend/dict-sql.c +++ b/src/lib-dict-backend/dict-sql.c @@ -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); -- 2.47.3