From: Timo Sirainen Date: Mon, 11 Nov 2019 12:27:55 +0000 (+0200) Subject: imap-hibernate: Fix crash when imap-master communication fails X-Git-Tag: 2.3.10~286 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=64a176b122f6378185ce5ee9e0cbf3b3523050b3;p=thirdparty%2Fdovecot%2Fcore.git imap-hibernate: Fix crash when imap-master communication fails Fixes a segfault if the communication times out or gets disconnected too early. This happens because read_callback() already frees the imap_master_connection. --- diff --git a/src/imap-hibernate/imap-master-connection.c b/src/imap-hibernate/imap-master-connection.c index a44785333c..a058a68799 100644 --- a/src/imap-hibernate/imap-master-connection.c +++ b/src/imap-hibernate/imap-master-connection.c @@ -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; }