]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
config: Cache converted ssl-parameters.dat result
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Fri, 12 Jul 2019 07:22:01 +0000 (10:22 +0300)
committerTimo Sirainen <timo.sirainen@open-xchange.com>
Fri, 12 Jul 2019 08:15:46 +0000 (11:15 +0300)
This way the ssl-parameters.dat is read only once by the config process
instead of for every config request.

src/config/doveconf.c
src/config/main.c
src/config/old-set-parser.c
src/config/old-set-parser.h

index 997946304cb1768000f65adb8ecc2ccc23917e5c..ea2b97dbbee1601cd8ca1d1c95119403e4506310 100644 (file)
@@ -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);
index d3d66db37c518f44e61420b67290723f6073cf2c..74edfa639f664e6d9c1f92e9c31ac7d58d77dd69 100644 (file)
@@ -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);
index b084c7575d61785543011a2b2e5e12c8a6b3f709..5aac8d94d5fbbcfad5015d5fe4c25f2a9aee8efb 100644 (file)
@@ -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);
+}
index 8a97f990be0ffd3281bfb0d208281a17d85c15c6..e95b3e1eb9cb82027b87a1d387084f4fe97952ba 100644 (file)
@@ -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