From: Timo Sirainen Date: Fri, 2 Dec 2022 12:52:53 +0000 (+0200) Subject: lib-storage: Fix memory leak by unreferencing duplicated settings parsers X-Git-Tag: 2.4.0~3316 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1f68109012fddd52d3e7f2d980960aaa60f05881;p=thirdparty%2Fdovecot%2Fcore.git lib-storage: Fix memory leak by unreferencing duplicated settings parsers Broken by e20c5c67fc01c80dd48bfc8efe15c212b725d46e --- diff --git a/src/lib-storage/mail-user.c b/src/lib-storage/mail-user.c index ada9ea9ef6..2a4767a8c8 100644 --- a/src/lib-storage/mail-user.c +++ b/src/lib-storage/mail-user.c @@ -64,6 +64,7 @@ mail_user_alloc_int(struct event *parent_event, user->refcount = 1; user->username = p_strdup(pool, username); user->unexpanded_set_parser = unexpanded_set_parser; + settings_parser_ref(user->unexpanded_set_parser); user->set_parser = settings_parser_dup(unexpanded_set_parser, pool); user->unexpanded_set = settings_parser_get_root_set(unexpanded_set_parser, @@ -102,9 +103,12 @@ struct mail_user *mail_user_alloc(struct event *parent_event, pool_t pool; pool = pool_alloconly_create(MEMPOOL_GROWING"mail user", 16*1024); - return mail_user_alloc_int(parent_event, username, - settings_parser_dup(unexpanded_set_parser, pool), - pool); + struct setting_parser_context *set_parser = + settings_parser_dup(unexpanded_set_parser, pool); + struct mail_user *user = + mail_user_alloc_int(parent_event, username, set_parser, pool); + settings_parser_unref(&set_parser); + return user; } static void @@ -233,6 +237,8 @@ void mail_user_unref(struct mail_user **_user) user->v.deinit_pre(user); user->v.deinit(user); } T_END; + settings_parser_unref(&user->set_parser); + settings_parser_unref(&user->unexpanded_set_parser); event_unref(&user->event); i_assert(user->refcount == 1); pool_unref(&user->pool);