From: Timo Sirainen Date: Wed, 4 Sep 2019 09:11:43 +0000 (+0300) Subject: imap-hibernate: Fix crash if unhibernation fd_send() fails X-Git-Tag: 2.3.9~156 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b096aa87404f2eab946369539eb1d02d94531588;p=thirdparty%2Fdovecot%2Fcore.git imap-hibernate: Fix crash if unhibernation fd_send() fails The imap-master connection needs to be freed when the client is freed. Otherwise it attempts to free the client again. --- diff --git a/src/imap-hibernate/imap-client.c b/src/imap-hibernate/imap-client.c index cc4edd303e..5adcb4943d 100644 --- a/src/imap-hibernate/imap-client.c +++ b/src/imap-hibernate/imap-client.c @@ -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, diff --git a/src/imap-hibernate/imap-master-connection.c b/src/imap-hibernate/imap-master-connection.c index 3c162303b9..a44785333c 100644 --- a/src/imap-hibernate/imap-master-connection.c +++ b/src/imap-hibernate/imap-master-connection.c @@ -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); diff --git a/src/imap-hibernate/imap-master-connection.h b/src/imap-hibernate/imap-master-connection.h index 8ed03f36e2..0ff2f3c611 100644 --- a/src/imap-hibernate/imap-master-connection.h +++ b/src/imap-hibernate/imap-master-connection.h @@ -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);