Skip to content

Commit 1f68109

Browse files
sirainencmouse
authored andcommitted
lib-storage: Fix memory leak by unreferencing duplicated settings parsers
Broken by e20c5c6
1 parent 6169c23 commit 1f68109

File tree

1 file changed

+9
-3
lines changed

1 file changed

+9
-3
lines changed

src/lib-storage/mail-user.c

+9-3
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ mail_user_alloc_int(struct event *parent_event,
6464
user->refcount = 1;
6565
user->username = p_strdup(pool, username);
6666
user->unexpanded_set_parser = unexpanded_set_parser;
67+
settings_parser_ref(user->unexpanded_set_parser);
6768
user->set_parser = settings_parser_dup(unexpanded_set_parser, pool);
6869
user->unexpanded_set =
6970
settings_parser_get_root_set(unexpanded_set_parser,
@@ -102,9 +103,12 @@ struct mail_user *mail_user_alloc(struct event *parent_event,
102103
pool_t pool;
103104

104105
pool = pool_alloconly_create(MEMPOOL_GROWING"mail user", 16*1024);
105-
return mail_user_alloc_int(parent_event, username,
106-
settings_parser_dup(unexpanded_set_parser, pool),
107-
pool);
106+
struct setting_parser_context *set_parser =
107+
settings_parser_dup(unexpanded_set_parser, pool);
108+
struct mail_user *user =
109+
mail_user_alloc_int(parent_event, username, set_parser, pool);
110+
settings_parser_unref(&set_parser);
111+
return user;
108112
}
109113

110114
static void
@@ -233,6 +237,8 @@ void mail_user_unref(struct mail_user **_user)
233237
user->v.deinit_pre(user);
234238
user->v.deinit(user);
235239
} T_END;
240+
settings_parser_unref(&user->set_parser);
241+
settings_parser_unref(&user->unexpanded_set_parser);
236242
event_unref(&user->event);
237243
i_assert(user->refcount == 1);
238244
pool_unref(&user->pool);

0 commit comments

Comments
 (0)