]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-storage, global: mail_storage_service_read_settings() - Return duplicated parser
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Tue, 7 Feb 2023 23:11:53 +0000 (01:11 +0200)
committerTimo Sirainen <timo.sirainen@open-xchange.com>
Mon, 20 Nov 2023 12:20:55 +0000 (14:20 +0200)
This will simplify following changes.

src/lib-storage/mail-storage-service.c
src/lmtp/lmtp-client.c
src/lmtp/lmtp-client.h
src/plugins/quota/quota-status.c

index 7b933b95ee35be74f47e261976ad0fdf8d90dee9..cce1b32ab03d8b3a50b32f7d18e74cd4236f3306 100644 (file)
@@ -1037,7 +1037,9 @@ int mail_storage_service_read_settings(struct mail_storage_service_ctx *ctx,
                return -1;
        }
        ctx->settings_looked_up = TRUE;
-       *parser_r = ctx->service->set_parser;
+       pool_t pool = pool_alloconly_create("mail storage service settings pool", 1024);
+       *parser_r = settings_parser_dup(ctx->service->set_parser, pool);
+       pool_unref(&pool);
        return 0;
 }
 
@@ -1194,15 +1196,17 @@ mail_storage_service_lookup_real(struct mail_storage_service_ctx *ctx,
                mail_storage_service_seteuid_root();
        }
 
-       if (input->set_parser != NULL)
-               set_parser = input->set_parser;
-       else if (mail_storage_service_read_settings(ctx, input,
+       pool_t user_pool = pool_alloconly_create(MEMPOOL_GROWING"mail storage service user", 1024*6);
+       if (input->set_parser != NULL) {
+               set_parser = settings_parser_dup(input->set_parser, user_pool);
+       } else if (mail_storage_service_read_settings(ctx, input,
                                                    &set_parser, error_r) < 0) {
                if (ctx->config_permission_denied) {
                        /* just restart and maybe next time we will open the
                           config socket before dropping privileges */
                        i_fatal("%s", *error_r);
                }
+               pool_unref(&user_pool);
                return -1;
        }
 
@@ -1236,7 +1240,9 @@ mail_storage_service_lookup_real(struct mail_storage_service_ctx *ctx,
        if (master_service_settings_parser_get(event, set_parser,
                                               &mail_user_setting_parser_info,
                                               0, &user_set, error_r) < 0) {
+               pool_unref(&user_pool);
                event_unref(&event);
+               settings_parser_unref(&set_parser);
                return -1;
        }
 
@@ -1248,7 +1254,9 @@ mail_storage_service_lookup_real(struct mail_storage_service_ctx *ctx,
        /* load global plugins */
        if (mail_storage_service_load_modules(ctx, user_set, error_r) < 0) {
                master_service_settings_free(user_set);
+               pool_unref(&user_pool);
                event_unref(&event);
+               settings_parser_unref(&set_parser);
                return -1;
        }
 
@@ -1258,7 +1266,6 @@ mail_storage_service_lookup_real(struct mail_storage_service_ctx *ctx,
        event_set_forced_debug(event,
                ctx->debug || (flags & MAIL_STORAGE_SERVICE_FLAG_DEBUG) != 0);
 
-       pool_t user_pool = pool_alloconly_create(MEMPOOL_GROWING"mail storage service user", 1024*6);
        const char *session_id = input->session_id != NULL ?
                p_strdup(user_pool, input->session_id) :
                mail_storage_service_generate_session_id(
@@ -1283,6 +1290,7 @@ mail_storage_service_lookup_real(struct mail_storage_service_ctx *ctx,
                        event_unref(&event);
                        pool_unref(&temp_pool);
                        pool_unref(&user_pool);
+                       settings_parser_unref(&set_parser);
                        return ret;
                }
                event_add_str(event, "user", username);
@@ -1305,7 +1313,7 @@ mail_storage_service_lookup_real(struct mail_storage_service_ctx *ctx,
        user->input.session_create_time = input->session_create_time;
        user->flags = flags;
 
-       user->set_parser = settings_parser_dup(set_parser, user_pool);
+       user->set_parser = set_parser;
        user->user_set = user_set;
        user->gid_source = "mail_gid setting";
        user->uid_source = "mail_uid setting";
@@ -1618,6 +1626,7 @@ void mail_storage_service_init_settings(struct mail_storage_service_ctx *ctx,
                        MASTER_SERVICE_SETTINGS_GET_FLAG_NO_EXPAND,
                        &user_set, &error) < 0)
                i_fatal("%s", error);
+       settings_parser_unref(&set_parser);
 
        mail_storage_service_first_init(ctx, user_set, ctx->flags);
        master_service_settings_free(user_set);
index 978fdf67590ed27e0ee1051743ba6c83c8a33c0c..485e467e5488ae8c9f0acd700536fba4bede4d3d 100644 (file)
@@ -100,7 +100,6 @@ static void client_load_modules(struct client *client)
 static void client_read_settings(struct client *client, bool ssl)
 {
        struct mail_storage_service_input input;
-       struct setting_parser_context *set_parser;
        const char *error;
 
        i_zero(&input);
@@ -113,22 +112,22 @@ static void client_read_settings(struct client *client, bool ssl)
        input.username = "";
 
        if (mail_storage_service_read_settings(storage_service, &input,
-                                              &set_parser, &error) < 0)
+                                              &client->set_parser, &error) < 0)
                i_fatal("%s", error);
 
        /* create raw user before duplicating the settings parser */
        client->raw_mail_user =
-               raw_storage_create_from_set(storage_service, set_parser);
+               raw_storage_create_from_set(storage_service, client->set_parser);
 
        const struct var_expand_table *tab =
                mail_storage_service_get_var_expand_table(storage_service, &input);
 
        struct event *event = event_create(client->event);
        event_set_ptr(event, MASTER_SERVICE_VAR_EXPAND_TABLE, (void *)tab);
-       if (master_service_settings_parser_get(event, set_parser,
+       if (master_service_settings_parser_get(event, client->set_parser,
                        &lda_setting_parser_info, 0,
                        &client->lda_set, &error) < 0 ||
-           master_service_settings_parser_get(event, set_parser,
+           master_service_settings_parser_get(event, client->set_parser,
                        &lmtp_setting_parser_info, 0,
                        &client->lmtp_set, &error) < 0)
                i_fatal("%s", error);
@@ -267,6 +266,7 @@ client_default_destroy(struct client *client)
 
        client_state_reset(client);
 
+       settings_parser_unref(&client->set_parser);
        master_service_settings_free(client->lda_set);
        master_service_settings_free(client->lmtp_set);
        event_unref(&client->event);
index 9373f7b4b7fb4426c09f155973127033936fc6f9..dd83350d0014b459bfa6a85f319c7b8af4442cdf 100644 (file)
@@ -72,6 +72,7 @@ struct client {
        struct lmtp_client_vfuncs v;
        struct event *event;
 
+       struct setting_parser_context *set_parser;
        const struct lda_settings *lda_set;
        const struct lmtp_settings *lmtp_set;
 
index 34147c1ee7a8e688b8bb923273186ca68f643d13..7e4d5a9628fe24f6f3f47e7285efca3bda884db3 100644 (file)
@@ -321,6 +321,7 @@ static void main_init(void)
        value = mail_user_set_plugin_getenv(mail_set, "quota_status_nouser");
        nouser_reply = i_strdup(value != NULL ? value : "REJECT Unknown user");
        master_service_settings_free(mail_set);
+       settings_parser_unref(&set_parser);
 }
 
 static void main_deinit(void)