From: Timo Sirainen Date: Thu, 11 Jan 2018 18:38:14 +0000 (-0500) Subject: *-login: Fix clients linked list corruption with SSL connections X-Git-Tag: 2.3.1~229 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=1c3b6f9221dc2a5270fe691bb625d0630196508e;p=thirdparty%2Fdovecot%2Fcore.git *-login: Fix clients linked list corruption with SSL connections This could have resulted in infinite loops or some of the clients being skipped for some operations. --- diff --git a/src/login-common/client-common.c b/src/login-common/client-common.c index 636af8b0d4..a3c6d7a54c 100644 --- a/src/login-common/client-common.c +++ b/src/login-common/client-common.c @@ -261,6 +261,7 @@ void client_disconnect(struct client *client, const char *reason) so don't disconnect the client until client_unref(). */ if (client->iostream_fd_proxy != NULL) { client->fd_proxying = TRUE; + i_assert(client->prev == NULL && client->next == NULL); DLLIST_PREPEND(&client_fd_proxies, client); client_fd_proxies_count++; } @@ -275,14 +276,16 @@ void client_destroy(struct client *client, const char *reason) return; client->destroyed = TRUE; - client_disconnect(client, reason); - - pool_unref(&client->preproxy_pool); - if (last_client == client) last_client = client->prev; + /* remove from clients linked list before it's added to + client_fd_proxies. */ DLLIST_REMOVE(&clients, client); + client_disconnect(client, reason); + + pool_unref(&client->preproxy_pool); + if (client->master_tag != 0) { i_assert(client->auth_request == NULL); i_assert(client->authenticating);