From: Timo Sirainen Date: Sat, 4 Feb 2017 11:51:13 +0000 (+0200) Subject: lib-storage: Don't duplicate service user's settings into mail_user X-Git-Tag: 2.3.0.rc1~2173 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=34512eaad8b1b2f929e6d6e3a2f7252c29fba97b;p=thirdparty%2Fdovecot%2Fcore.git lib-storage: Don't duplicate service user's settings into mail_user The mail_storage_service_user.user_set isn't used afterwards, so it can be directly used to avoid wasting memory. --- diff --git a/src/lib-storage/mail-storage-service.c b/src/lib-storage/mail-storage-service.c index c74543957b..857224d754 100644 --- a/src/lib-storage/mail-storage-service.c +++ b/src/lib-storage/mail-storage-service.c @@ -658,8 +658,8 @@ mail_storage_service_init_post(struct mail_storage_service_ctx *ctx, /* NOTE: if more user initialization is added, add it also to mail_user_dup() */ - mail_user = mail_user_alloc(user->input.username, user->user_info, - user->user_set); + mail_user = mail_user_alloc_nodup_set(user->input.username, + user->user_info, user->user_set); mail_user->_service_user = user; mail_user_set_home(mail_user, *home == '\0' ? NULL : home); mail_user_set_vars(mail_user, ctx->service->name, @@ -741,6 +741,7 @@ mail_storage_service_init_post(struct mail_storage_service_ctx *ctx, return -1; } } + *mail_user_r = mail_user; return 0; } diff --git a/src/lib-storage/mail-user.c b/src/lib-storage/mail-user.c index 16a72ae9f5..4a02930346 100644 --- a/src/lib-storage/mail-user.c +++ b/src/lib-storage/mail-user.c @@ -43,24 +43,23 @@ static void mail_user_stats_fill_base(struct mail_user *user ATTR_UNUSED, { } -struct mail_user *mail_user_alloc(const char *username, - const struct setting_parser_info *set_info, - const struct mail_user_settings *set) +static struct mail_user * +mail_user_alloc_int(const char *username, + const struct setting_parser_info *set_info, + const struct mail_user_settings *set, pool_t pool) { struct mail_user *user; const char *error; - pool_t pool; i_assert(username != NULL); i_assert(*username != '\0'); - pool = pool_alloconly_create(MEMPOOL_GROWING"mail user", 16*1024); user = p_new(pool, struct mail_user, 1); user->pool = pool; user->refcount = 1; user->username = p_strdup(pool, username); user->set_info = set_info; - user->unexpanded_set = settings_dup(set_info, set, pool); + user->unexpanded_set = set; user->set = settings_dup_with_pointers(set_info, user->unexpanded_set, pool); user->service = master_service_get_name(master_service); user->default_normalizer = uni_utf8_to_decomposed_titlecase; @@ -77,6 +76,28 @@ struct mail_user *mail_user_alloc(const char *username, return user; } +struct mail_user * +mail_user_alloc_nodup_set(const char *username, + const struct setting_parser_info *set_info, + const struct mail_user_settings *set) +{ + pool_t pool; + + pool = pool_alloconly_create(MEMPOOL_GROWING"mail user", 16*1024); + return mail_user_alloc_int(username, set_info, set, pool); +} + +struct mail_user *mail_user_alloc(const char *username, + const struct setting_parser_info *set_info, + const struct mail_user_settings *set) +{ + pool_t pool; + + pool = pool_alloconly_create(MEMPOOL_GROWING"mail user", 16*1024); + return mail_user_alloc_int(username, set_info, + settings_dup(set_info, set, pool), pool); +} + static void mail_user_expand_plugins_envs(struct mail_user *user) { diff --git a/src/lib-storage/mail-user.h b/src/lib-storage/mail-user.h index 8ae20ea225..7b0bd45598 100644 --- a/src/lib-storage/mail-user.h +++ b/src/lib-storage/mail-user.h @@ -116,6 +116,10 @@ extern const struct var_expand_func_table *mail_user_var_expand_func_table; struct mail_user *mail_user_alloc(const char *username, const struct setting_parser_info *set_info, const struct mail_user_settings *set); +struct mail_user * +mail_user_alloc_nodup_set(const char *username, + const struct setting_parser_info *set_info, + const struct mail_user_settings *set); /* Returns -1 if settings were invalid. */ int mail_user_init(struct mail_user *user, const char **error_r);