From: Stephan Bosch Date: Fri, 3 Nov 2023 00:57:38 +0000 (+0100) Subject: lib-auth-client: auth-client - Move request removal decision to auth_client_request_s... X-Git-Tag: 2.4.0~2419 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=4ba9240c9629478bdcbc463d6b28fc97f8f67820;p=thirdparty%2Fdovecot%2Fcore.git lib-auth-client: auth-client - Move request removal decision to auth_client_request_server_input() --- diff --git a/src/lib-auth-client/auth-client-connection.c b/src/lib-auth-client/auth-client-connection.c index 7761578719..6f854987d5 100644 --- a/src/lib-auth-client/auth-client-connection.c +++ b/src/lib-auth-client/auth-client-connection.c @@ -220,7 +220,7 @@ static void auth_client_connection_handshake_ready(struct connection *_conn) static int auth_server_lookup_request(struct auth_client_connection *conn, - const char *id_arg, bool remove, + const char *id_arg, bool server_finished, struct auth_client_request **request_r) { struct auth_client_request *request; @@ -238,8 +238,13 @@ auth_server_lookup_request(struct auth_client_connection *conn, "Authentication server sent unknown id %u", id); return 0; } - if (remove || auth_client_request_is_aborted(request)) - auth_client_connection_remove_request(request->conn, request); + if (request->server_finished) { + e_error(conn->conn.event, + "Authentication server sent finished id %u", id); + return 0; + } + if (server_finished) + request->server_finished = TRUE; *request_r = request; return 1; @@ -255,7 +260,7 @@ auth_server_input_ok(struct auth_client_connection *conn, ret = auth_server_lookup_request(conn, args[0], TRUE, &request); if (ret <= 0) return ret; - auth_client_request_server_input(request, AUTH_REQUEST_STATUS_OK, + auth_client_request_server_input(&request, AUTH_REQUEST_STATUS_OK, args + 1); return 0; } @@ -276,7 +281,7 @@ auth_server_input_cont(struct auth_client_connection *conn, ret = auth_server_lookup_request(conn, args[0], FALSE, &request); if (ret <= 0) return ret; - auth_client_request_server_input(request, AUTH_REQUEST_STATUS_CONTINUE, + auth_client_request_server_input(&request, AUTH_REQUEST_STATUS_CONTINUE, args + 1); return 0; } @@ -291,7 +296,7 @@ auth_server_input_fail(struct auth_client_connection *conn, ret = auth_server_lookup_request(conn, args[0], TRUE, &request); if (ret <= 0) return ret; - auth_client_request_server_input(request, AUTH_REQUEST_STATUS_FAIL, + auth_client_request_server_input(&request, AUTH_REQUEST_STATUS_FAIL, args + 1); return 0; } @@ -386,7 +391,7 @@ auth_client_connection_remove_requests(struct auth_client_connection *conn, oldest = created; } - auth_client_request_server_input(request, + auth_client_request_server_input(&request, AUTH_REQUEST_STATUS_INTERNAL_FAIL, temp_failure_args); } diff --git a/src/lib-auth-client/auth-client-private.h b/src/lib-auth-client/auth-client-private.h index e8fcfa87f3..d5c99e2fc3 100644 --- a/src/lib-auth-client/auth-client-private.h +++ b/src/lib-auth-client/auth-client-private.h @@ -19,6 +19,7 @@ struct auth_client_request { auth_request_callback_t *callback; void *context; + bool server_finished:1; bool removed:1; }; @@ -68,7 +69,7 @@ extern struct event_category event_category_auth_client; bool auth_client_request_is_aborted(struct auth_client_request *request); time_t auth_client_request_get_create_time(struct auth_client_request *request); -void auth_client_request_server_input(struct auth_client_request *request, +void auth_client_request_server_input(struct auth_client_request **_request, enum auth_request_status status, const char *const *args); diff --git a/src/lib-auth-client/auth-client-request.c b/src/lib-auth-client/auth-client-request.c index d74b4a7810..472e3c05ea 100644 --- a/src/lib-auth-client/auth-client-request.c +++ b/src/lib-auth-client/auth-client-request.c @@ -343,16 +343,18 @@ void auth_client_request_continue(struct auth_client_request *request, } } -void auth_client_request_server_input(struct auth_client_request *request, +void auth_client_request_server_input(struct auth_client_request **_request, enum auth_request_status status, const char *const *args) { + struct auth_client_request *request = *_request; const char *const *tmp, *base64_data = NULL; struct event_passthrough *e; if (auth_client_request_is_aborted(request)) { /* aborted already */ - return; + auth_client_request_free(_request); + return TRUE; } switch (status) { @@ -402,7 +404,7 @@ void auth_client_request_server_input(struct auth_client_request *request, call_callback(request, status, base64_data, args); if (status != AUTH_REQUEST_STATUS_CONTINUE) - auth_client_request_free(&request); + auth_client_request_free(_request); } void auth_client_send_cancel(struct auth_client *client, unsigned int id)