From 1e46b1f590d1826aa8440d9f6fac780bbb42d0dc Mon Sep 17 00:00:00 2001 From: Timo Sirainen Date: Fri, 12 Jul 2019 10:22:01 +0300 Subject: [PATCH] config: Cache converted ssl-parameters.dat result This way the ssl-parameters.dat is read only once by the config process instead of for every config request. --- src/config/doveconf.c | 2 ++ src/config/main.c | 2 ++ src/config/old-set-parser.c | 23 ++++++++++++++++++++++- src/config/old-set-parser.h | 1 + 4 files changed, 27 insertions(+), 1 deletion(-) diff --git a/src/config/doveconf.c b/src/config/doveconf.c index 997946304c..ea2b97dbbe 100644 --- a/src/config/doveconf.c +++ b/src/config/doveconf.c @@ -16,6 +16,7 @@ #include "master-service.h" #include "all-settings.h" #include "sysinfo-get.h" +#include "old-set-parser.h" #include "config-connection.h" #include "config-parser.h" #include "config-request.h" @@ -1057,6 +1058,7 @@ int main(int argc, char *argv[]) i_fatal("Errors in configuration"); config_filter_deinit(&config_filter); + old_settings_deinit_global(); module_dir_unload(&modules); config_parser_deinit(); master_service_deinit(&master_service); diff --git a/src/config/main.c b/src/config/main.c index d3d66db37c..74edfa639f 100644 --- a/src/config/main.c +++ b/src/config/main.c @@ -4,6 +4,7 @@ #include "module-dir.h" #include "restrict-access.h" #include "master-service.h" +#include "old-set-parser.h" #include "config-connection.h" #include "config-parser.h" #include "config-request.h" @@ -44,6 +45,7 @@ int main(int argc, char *argv[]) config_connections_destroy_all(); config_filter_deinit(&config_filter); + old_settings_deinit_global(); module_dir_unload(&modules); config_parser_deinit(); master_service_deinit(&master_service); diff --git a/src/config/old-set-parser.c b/src/config/old-set-parser.c index b084c7575d..5aac8d94d5 100644 --- a/src/config/old-set-parser.c +++ b/src/config/old-set-parser.c @@ -42,6 +42,9 @@ static const struct config_filter managesieve_filter = { .service = "sieve" }; +static char *ssl_dh_value = NULL; +static bool ssl_dh_loaded = FALSE; + static void ATTR_FORMAT(2, 3) obsolete(struct config_parser_context *ctx, const char *str, ...) { @@ -68,7 +71,7 @@ static void set_rename(struct config_parser_context *ctx, config_parser_apply_line(ctx, CONFIG_LINE_TYPE_KEYVALUE, key, value); } -bool old_settings_ssl_dh_load(const char **value, const char **error_r) +static bool old_settings_ssl_dh_read(const char **value, const char **error_r) { if (ssl_dh_parameters != NULL) *value = ssl_dh_parameters; @@ -149,6 +152,19 @@ bool old_settings_ssl_dh_load(const char **value, const char **error_r) return TRUE; } +bool old_settings_ssl_dh_load(const char **value, const char **error_r) +{ + if (ssl_dh_loaded) { + *value = ssl_dh_value; + return TRUE; + } + if (!old_settings_ssl_dh_read(value, error_r)) + return FALSE; + ssl_dh_value = i_strdup(*value); + ssl_dh_loaded = TRUE; + return TRUE; +} + /* FIXME: Remove ssl_protocols_to_min_protocol() in v2.4 */ static int ssl_protocols_to_min_protocol(const char *ssl_protocols, const char **min_protocol_r, @@ -775,3 +791,8 @@ void old_settings_init(struct config_parser_context *ctx) ctx->old = p_new(ctx->pool, struct old_set_parser, 1); ctx->old->base_dir = PKG_RUNDIR; } + +void old_settings_deinit_global(void) +{ + i_free(ssl_dh_value); +} diff --git a/src/config/old-set-parser.h b/src/config/old-set-parser.h index 8a97f990be..e95b3e1eb9 100644 --- a/src/config/old-set-parser.h +++ b/src/config/old-set-parser.h @@ -11,5 +11,6 @@ bool old_settings_handle(struct config_parser_context *ctx, enum config_line_type type, const char *key, const char *value); void old_settings_init(struct config_parser_context *ctx); +void old_settings_deinit_global(void); #endif -- 2.47.3