From: Timo Sirainen Date: Tue, 31 Oct 2017 23:47:54 +0000 (+0200) Subject: login-common: Call io_stream_ssl_global_init() early X-Git-Tag: 2.3.0.rc1~512 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=4635b36b00117690bb7321e45535d45feec4b871;p=thirdparty%2Fdovecot%2Fcore.git login-common: Call io_stream_ssl_global_init() early --- diff --git a/src/login-common/login-common.h b/src/login-common/login-common.h index f31df4f35d..7ffd241a4c 100644 --- a/src/login-common/login-common.h +++ b/src/login-common/login-common.h @@ -53,6 +53,7 @@ extern unsigned int initial_service_count; /* NULL-terminated array of all alt_usernames seen so far. Existing fields are never removed. */ extern ARRAY_TYPE(string) global_alt_usernames; +extern bool login_ssl_initialized; extern const struct login_settings *global_login_settings; extern const struct master_service_ssl_settings *global_ssl_settings; diff --git a/src/login-common/main.c b/src/login-common/main.c index c5e7dffb70..7560852fcd 100644 --- a/src/login-common/main.c +++ b/src/login-common/main.c @@ -44,6 +44,7 @@ const char *login_rawlog_dir = NULL; unsigned int initial_service_count; struct login_module_register login_module_register; ARRAY_TYPE(string) global_alt_usernames; +bool login_ssl_initialized; const struct login_settings *global_login_settings; const struct master_service_ssl_settings *global_ssl_settings; @@ -364,12 +365,29 @@ static void login_load_modules(void) module_dir_init(modules); } +static void login_ssl_init(void) +{ + struct ssl_iostream_settings ssl_set; + const char *error; + + if (strcmp(global_ssl_settings->ssl, "no") == 0) + return; + + master_service_ssl_settings_to_iostream_set(global_ssl_settings, + pool_datastack_create(), + MASTER_SERVICE_SSL_SETTINGS_TYPE_SERVER, &ssl_set); + if (io_stream_ssl_global_init(&ssl_set, &error) < 0) + i_fatal("Failed to initialize SSL library: %s", error); + login_ssl_initialized = TRUE; +} + static void main_preinit(void) { unsigned int max_fds; /* Initialize SSL proxy so it can read certificate and private key file. */ + login_ssl_init(); ssl_proxy_init(); dsasl_clients_init(); client_common_init(); @@ -394,7 +412,7 @@ static void main_preinit(void) io_loop_set_max_fd_count(current_ioloop, max_fds); i_assert(strcmp(global_ssl_settings->ssl, "no") == 0 || - ssl_initialized); + login_ssl_initialized); if (global_login_settings->mail_max_userip_connections > 0) login_anvil_init();