]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
login-common: Fix memory leak if anvil query is aborted
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Fri, 16 Apr 2021 13:13:39 +0000 (16:13 +0300)
committerTimo Sirainen <timo.sirainen@open-xchange.com>
Fri, 16 Apr 2021 14:20:12 +0000 (17:20 +0300)
src/login-common/client-common.h
src/login-common/sasl-server.c

index cc1d46826af7963056c19ca63b2583dc6df69447..2c7c6ee036834b16347c94e1877b90fd9a40613d 100644 (file)
@@ -194,6 +194,7 @@ struct client {
        const char *sasl_final_resp;
        const char *const *auth_passdb_args;
        struct anvil_query *anvil_query;
+       struct anvil_request *anvil_request;
 
        unsigned int master_auth_id;
        unsigned int master_tag;
index 22688d537f3e91374a5698de9f241ddfd4305828..bfa420943ededd3f9d8087b5b338221fff5a58a2 100644 (file)
@@ -223,6 +223,7 @@ anvil_lookup_callback(const char *reply, void *context)
        int ret;
 
        client->anvil_query = NULL;
+       client->anvil_request = NULL;
 
        conn_count = 0;
        if (reply != NULL && str_to_uint(reply, &conn_count) < 0)
@@ -273,6 +274,7 @@ anvil_check_too_many_connections(struct client *client,
        query = t_strconcat("LOOKUP\t", login_binary->protocol, "/",
                            net_ip2addr(&client->ip), "/",
                            str_tabescape(client->virtual_user), NULL);
+       client->anvil_request = req;
        client->anvil_query =
                anvil_client_query(anvil, query, anvil_lookup_callback, req);
 }
@@ -553,7 +555,9 @@ void sasl_server_auth_failed(struct client *client, const char *reason,
 void sasl_server_auth_abort(struct client *client)
 {
        client->auth_try_aborted = TRUE;
-       if (client->anvil_query != NULL)
+       if (client->anvil_query != NULL) {
                anvil_client_query_abort(anvil, &client->anvil_query);
+               i_free(client->anvil_request);
+       }
        sasl_server_auth_cancel(client, NULL, NULL, SASL_SERVER_REPLY_AUTH_ABORTED);
 }