From: Stephan Bosch Date: Fri, 27 Oct 2023 18:25:31 +0000 (+0200) Subject: lib-auth-client: auth-client-connection - Allow calling auth_client_connection_remove... X-Git-Tag: 2.4.0~2421 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=88acdd82f22947800a51d4b9f0bc01b34d243ae2;p=thirdparty%2Fdovecot%2Fcore.git lib-auth-client: auth-client-connection - Allow calling auth_client_connection_remove_request() on removed request --- diff --git a/src/lib-auth-client/auth-client-connection.c b/src/lib-auth-client/auth-client-connection.c index be0436dc31..7761578719 100644 --- a/src/lib-auth-client/auth-client-connection.c +++ b/src/lib-auth-client/auth-client-connection.c @@ -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; } diff --git a/src/lib-auth-client/auth-client-private.h b/src/lib-auth-client/auth-client-private.h index 134a367817..e8fcfa87f3 100644 --- a/src/lib-auth-client/auth-client-private.h +++ b/src/lib-auth-client/auth-client-private.h @@ -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 diff --git a/src/lib-auth-client/auth-client-request.c b/src/lib-auth-client/auth-client-request.c index a20ebcc5ee..d1c9eb0e1b 100644 --- a/src/lib-auth-client/auth-client-request.c +++ b/src/lib-auth-client/auth-client-request.c @@ -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); }