From: Timo Sirainen Date: Tue, 2 Mar 2021 14:00:24 +0000 (+0200) Subject: submission: Simplify client_destroy() handling X-Git-Tag: 2.3.15~280 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=d013b6fd8b29f1a7f860f2cd8beacc93117adf69;p=thirdparty%2Fdovecot%2Fcore.git submission: Simplify client_destroy() handling Now it simply calls smtp_server_connection_terminate() and the conn_free() callback does the actual destroying. --- diff --git a/src/submission/submission-backend.c b/src/submission/submission-backend.c index 6f822a9f77..5bbcdc4e6a 100644 --- a/src/submission/submission-backend.c +++ b/src/submission/submission-backend.c @@ -137,7 +137,7 @@ void submission_backend_fail(struct submission_backend *backend, if (backend == client->backend_default) { /* default backend: fail the whole client */ - client_destroy(client, enh_code, reason); + client_destroy(&client, enh_code, reason); return; } diff --git a/src/submission/submission-client.c b/src/submission/submission-client.c index 43299fb727..e4503ae9c1 100644 --- a/src/submission/submission-client.c +++ b/src/submission/submission-client.c @@ -294,25 +294,26 @@ static void client_state_reset(struct client *client) i_zero(&client->state); } -void client_destroy(struct client *client, const char *prefix, +void client_destroy(struct client **_client, const char *prefix, const char *reason) { - client->v.destroy(client, prefix, reason); + struct client *client = *_client; + + *_client = NULL; + + smtp_server_connection_terminate(&client->conn, + (prefix == NULL ? "4.0.0" : prefix), reason); } static void -client_default_destroy(struct client *client, const char *prefix, - const char *reason) +client_default_destroy(struct client *client) { + i_assert(client->disconnected); + if (client->destroyed) return; client->destroyed = TRUE; - if (client->conn != NULL) { - smtp_server_connection_terminate(&client->conn, - (prefix == NULL ? "4.0.0" : prefix), reason); - } - submission_backends_destroy_all(client); array_free(&client->pending_backends); array_free(&client->rcpt_to); @@ -459,7 +460,7 @@ static void client_connection_free(void *context) { struct client *client = context; - client_destroy(client, NULL, NULL); + client->v.destroy(client); } uoff_t client_get_max_mail_size(struct client *client) @@ -512,9 +513,10 @@ void client_add_extra_capability(struct client *client, const char *capability, void clients_destroy_all(void) { while (submission_clients != NULL) { - mail_storage_service_io_activate_user(submission_clients->service_user); - client_destroy(submission_clients, - "4.3.2", "Shutting down"); + struct client *client = submission_clients; + + mail_storage_service_io_activate_user(client->service_user); + client_destroy(&client, "4.3.2", "Shutting down"); } } diff --git a/src/submission/submission-client.h b/src/submission/submission-client.h index e24efd8ef3..37752685f4 100644 --- a/src/submission/submission-client.h +++ b/src/submission/submission-client.h @@ -28,8 +28,7 @@ struct client_extra_capability { }; struct submission_client_vfuncs { - void (*destroy)(struct client *client, const char *prefix, - const char *reason); + void (*destroy)(struct client *client); void (*trans_start)(struct client *client, struct smtp_server_transaction *trans); @@ -142,7 +141,7 @@ struct client *client_create(int fd_in, int fd_out, const char *helo, const unsigned char *pdata, unsigned int pdata_len); -void client_destroy(struct client *client, const char *prefix, +void client_destroy(struct client **client, const char *prefix, const char *reason) ATTR_NULL(2, 3); typedef void (*client_input_callback_t)(struct client *context);