]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
imap, pop3: Don't access login_set.*_socket_path after they're freed from data stack
authorTimo Sirainen <timo.sirainen@dovecot.fi>
Thu, 2 Nov 2017 21:01:20 +0000 (23:01 +0200)
committerTimo Sirainen <timo.sirainen@dovecot.fi>
Thu, 2 Nov 2017 21:01:20 +0000 (23:01 +0200)
Call master_login_init() before master_service_init_finish(), which frees
all the data stack done in initialization.

This didn't normally cause any visible problems, because data stack wasn't
currently being used in a way that the strings were invalidated. However,
it was causing failures if --enable-devel-checks was used.

src/imap/main.c
src/pop3/main.c

index 15ffb480d20f2f152fa719b3cd68f58650174e60..4c501ecd91350a5841b2ec9a3e3e62ef04ef10f2 100644 (file)
@@ -467,10 +467,26 @@ int main(int argc, char *argv[])
        imap_fetch_handlers_init();
        imap_master_clients_init();
 
+       const char *error;
+       if (t_abspath(auth_socket_path, &login_set.auth_socket_path, &error) < 0)
+               i_fatal("t_abspath(%s) failed: %s", auth_socket_path, error);
+
+       if (argv[optind] != NULL) {
+               if (t_abspath(argv[optind], &login_set.postlogin_socket_path, &error) < 0)
+                       i_fatal("t_abspath(%s) failed: %s", argv[optind], error);
+       }
+       login_set.callback = login_client_connected;
+       login_set.failure_callback = login_client_failed;
+
+       if (!IS_STANDALONE())
+               master_login = master_login_init(master_service, &login_set);
+
        storage_service =
                mail_storage_service_init(master_service,
                                          set_roots, storage_service_flags);
        master_service_init_finish(master_service);
+       /* NOTE: login_set.*_socket_path are now invalid due to data stack
+          having been freed */
 
        /* fake that we're running, so we know if client was destroyed
           while handling its initial input */
@@ -480,25 +496,9 @@ int main(int argc, char *argv[])
                T_BEGIN {
                        main_stdio_run(username);
                } T_END;
-       } else T_BEGIN {
-               const char *error;
-               if (t_abspath(auth_socket_path, &login_set.auth_socket_path,
-                             &error) < 0) {
-                       i_fatal("t_abspath(%s) failed: %s", auth_socket_path,
-                               error);
-               }
-
-               if (argv[optind] != NULL) {
-                       if (t_abspath(argv[optind], &login_set.postlogin_socket_path, &error) < 0) {
-                               i_fatal("t_abspath(%s) failed: %s", argv[optind], error);
-                       }
-               }
-               login_set.callback = login_client_connected;
-               login_set.failure_callback = login_client_failed;
-
-               master_login = master_login_init(master_service, &login_set);
+       } else {
                io_loop_set_running(current_ioloop);
-       } T_END;
+       }
 
        if (io_loop_is_running(current_ioloop))
                master_service_run(master_service, client_connected);
index f9de457bc23f838be05e35dc0ea4b59896f37353..9796e684427df8faf65efdd7f2c79c19c4cdb953 100644 (file)
@@ -374,6 +374,8 @@ int main(int argc, char *argv[])
        }
        login_set.callback = login_client_connected;
        login_set.failure_callback = login_client_failed;
+       if (!IS_STANDALONE())
+               master_login = master_login_init(master_service, &login_set);
 
        master_service_set_die_callback(master_service, pop3_die);
 
@@ -381,6 +383,8 @@ int main(int argc, char *argv[])
                mail_storage_service_init(master_service,
                                          set_roots, storage_service_flags);
        master_service_init_finish(master_service);
+       /* NOTE: login_set.*_socket_path are now invalid due to data stack
+          having been freed */
 
        /* fake that we're running, so we know if client was destroyed
           while handling its initial input */
@@ -391,7 +395,6 @@ int main(int argc, char *argv[])
                        main_stdio_run(username);
                } T_END;
        } else {
-               master_login = master_login_init(master_service, &login_set);
                io_loop_set_running(current_ioloop);
        }