]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-auth-client: auth-client-connection - Allow calling auth_client_connection_remove...
authorStephan Bosch <stephan.bosch@open-xchange.com>
Fri, 27 Oct 2023 18:25:31 +0000 (20:25 +0200)
committeraki.tuomi <aki.tuomi@open-xchange.com>
Fri, 17 Nov 2023 10:49:10 +0000 (10:49 +0000)
src/lib-auth-client/auth-client-connection.c
src/lib-auth-client/auth-client-private.h
src/lib-auth-client/auth-client-request.c

index be0436dc31344c09ae63dc6527325e1072d1c98d..7761578719f1daa433dd3a3a7ab7eef2f4bd93af 100644 (file)
@@ -239,7 +239,7 @@ auth_server_lookup_request(struct auth_client_connection *conn,
                return 0;
        }
        if (remove || auth_client_request_is_aborted(request))
-               hash_table_remove(conn->requests, POINTER_CAST(id));
+               auth_client_connection_remove_request(request->conn, request);
 
        *request_r = request;
        return 1;
@@ -570,8 +570,11 @@ auth_client_connection_add_request(struct auth_client_connection *conn,
 }
 
 void auth_client_connection_remove_request(struct auth_client_connection *conn,
-                                          unsigned int id)
+                                          struct auth_client_request *request)
 {
+       if (request->removed)
+               return;
        i_assert(conn->conn.handshake_received);
-       hash_table_remove(conn->requests, POINTER_CAST(id));
+       hash_table_remove(conn->requests, POINTER_CAST(request->id));
+       request->removed = TRUE;
 }
index 134a36781792852d05a4201688855ece967f307e..e8fcfa87f3bb71bd604554bb4a65b68dd9765021 100644 (file)
@@ -18,6 +18,8 @@ struct auth_client_request {
 
        auth_request_callback_t *callback;
        void *context;
+
+       bool removed:1;
 };
 
 struct auth_client_connection {
@@ -86,6 +88,6 @@ unsigned int
 auth_client_connection_add_request(struct auth_client_connection *conn,
                                   struct auth_client_request *request);
 void auth_client_connection_remove_request(struct auth_client_connection *conn,
-                                          unsigned int id);
+                                          struct auth_client_request *request);
 
 #endif
index a20ebcc5ee4ab744f039e7fa640a7097a38ad6df..d1c9eb0e1b412c14ff925ee53dfe890ac9276b66 100644 (file)
@@ -247,6 +247,8 @@ static void auth_client_request_free(struct auth_client_request **_request)
 
        *_request = NULL;
 
+       auth_client_connection_remove_request(request->conn, request);
+
        timeout_remove(&request->to_fail);
        event_unref(&request->event);
        pool_unref(&request->pool);
@@ -267,8 +269,6 @@ void auth_client_request_abort(struct auth_client_request **_request,
 
        auth_client_send_cancel(request->conn->client, request->id);
        call_callback(request, AUTH_REQUEST_STATUS_ABORT, NULL, NULL);
-       /* remove the request */
-       auth_client_connection_remove_request(request->conn, request->id);
        auth_client_request_free(&request);
 }