]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
imap-hibernate: Fix crash if unhibernation fd_send() fails
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Wed, 4 Sep 2019 09:11:43 +0000 (12:11 +0300)
committerTimo Sirainen <timo.sirainen@open-xchange.com>
Sun, 15 Sep 2019 17:38:31 +0000 (17:38 +0000)
The imap-master connection needs to be freed when the client is freed.
Otherwise it attempts to free the client again.

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

index cc4edd303eab6e5276ee36dec578a732953950af..5adcb4943d41db2fbc0768010b4769ce491c4c83 100644 (file)
@@ -613,6 +613,8 @@ void imap_client_destroy(struct imap_client **_client, const char *reason)
                        "\n", NULL));
        }
 
+       if (client->master_conn != NULL)
+               imap_master_connection_free(&client->master_conn);
        if (client->ioloop_ctx != NULL) {
                io_loop_context_remove_callbacks(client->ioloop_ctx,
                                                 imap_client_io_activate_user,
index 3c162303b9ee26caedaecee7efc22fbc9bbbed2a..a44785333c49119a2e3b301456c866c1bffef4d4 100644 (file)
@@ -62,6 +62,14 @@ void imap_master_connection_deinit(struct imap_master_connection **_conn)
 
        if (conn->read_callback != NULL)
                conn->read_callback(conn->context, "-");
+       imap_master_connection_free(&conn);
+}
+
+void imap_master_connection_free(struct imap_master_connection **_conn)
+{
+       struct imap_master_connection *conn = *_conn;
+
+       *_conn = NULL;
 
        timeout_remove(&conn->to);
        connection_deinit(&conn->conn);
index 8ed03f36e24e50dacd32274ce1b67b159016cf3b..0ff2f3c611a5a8ba6ff12cfbd8336f7de33d406a 100644 (file)
@@ -16,6 +16,7 @@ int imap_master_connection_init(const char *path,
                                struct imap_master_connection **conn_r,
                                const char **error_r);
 void imap_master_connection_deinit(struct imap_master_connection **conn);
+void imap_master_connection_free(struct imap_master_connection **conn);
 
 void imap_master_connections_init(void);
 void imap_master_connections_deinit(void);