]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
imap-hibernate: Fix crash when imap-master communication fails
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Mon, 11 Nov 2019 12:27:55 +0000 (14:27 +0200)
committeraki.tuomi <aki.tuomi@open-xchange.com>
Wed, 20 Nov 2019 07:56:37 +0000 (07:56 +0000)
Fixes a segfault if the communication times out or gets disconnected too
early. This happens because read_callback() already frees the
imap_master_connection.

src/imap-hibernate/imap-master-connection.c

index a44785333c49119a2e3b301456c866c1bffef4d4..a058a68799c045405afc8754529bdba5e4fa4b01 100644 (file)
@@ -54,15 +54,23 @@ int imap_master_connection_init(const char *path,
        return 1;
 }
 
-void imap_master_connection_deinit(struct imap_master_connection **_conn)
+static void
+imap_master_read_callback(struct imap_master_connection **_conn,
+                         const char *line)
 {
        struct imap_master_connection *conn = *_conn;
+       imap_master_connection_read_callback_t *read_callback =
+               conn->read_callback;
 
        *_conn = NULL;
+       conn->read_callback = NULL;
+       read_callback(conn->context, line);
+       /* connection is destroyed now */
+}
 
-       if (conn->read_callback != NULL)
-               conn->read_callback(conn->context, "-");
-       imap_master_connection_free(&conn);
+void imap_master_connection_deinit(struct imap_master_connection **_conn)
+{
+       imap_master_read_callback(_conn, "-");
 }
 
 void imap_master_connection_free(struct imap_master_connection **_conn)
@@ -97,11 +105,7 @@ imap_master_client_input_line(struct connection *_conn, const char *line)
                conn->send_callback(conn->context, _conn->output);
                return 1;
        } else {
-               imap_master_connection_read_callback_t *read_callback =
-                       conn->read_callback;
-
-               conn->read_callback = NULL;
-               read_callback(conn->context, line);
+               imap_master_read_callback(&conn, line);
                /* we're finished now with this connection - disconnect it */
                return -1;
        }