From: Timo Sirainen Date: Thu, 5 Jan 2023 11:02:07 +0000 (+0200) Subject: *-login: Allow client.create() to return failure X-Git-Tag: 2.4.0~2326 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c93c3213ddc127e3d46ee63f612a676bea858698;p=thirdparty%2Fdovecot%2Fcore.git *-login: Allow client.create() to return failure --- diff --git a/src/imap-login/imap-login-client.c b/src/imap-login/imap-login-client.c index 7b3cfdd876..0ecef9f26f 100644 --- a/src/imap-login/imap-login-client.c +++ b/src/imap-login/imap-login-client.c @@ -376,7 +376,7 @@ static struct client *imap_client_alloc(pool_t pool) return &imap_client->common; } -static void imap_client_create(struct client *client, void **other_sets) +static int imap_client_create(struct client *client, void **other_sets) { struct imap_client *imap_client = (struct imap_client *)client; @@ -388,6 +388,7 @@ static void imap_client_create(struct client *client, void **other_sets) if (imap_client->set->imap_literal_minus) imap_parser_enable_literal_minus(imap_client->parser); client->io = io_add_istream(client->input, client_input, client); + return 0; } static void imap_client_destroy(struct client *client) diff --git a/src/imap-urlauth-login/imap-urlauth-login.c b/src/imap-urlauth-login/imap-urlauth-login.c index 04cbaf23fb..12df297d73 100644 --- a/src/imap-urlauth-login/imap-urlauth-login.c +++ b/src/imap-urlauth-login/imap-urlauth-login.c @@ -143,7 +143,7 @@ static struct client *imap_urlauth_client_alloc(pool_t pool) return &uauth_client->common; } -static void imap_urlauth_client_create +static int imap_urlauth_client_create (struct client *client, void **other_sets) { struct imap_urlauth_client *uauth_client = @@ -151,6 +151,7 @@ static void imap_urlauth_client_create uauth_client->set = other_sets[0]; client->io = io_add_istream(client->input, client_input, client); + return 0; } static void imap_urlauth_client_notify_auth_ready(struct client *client) diff --git a/src/login-common/client-common.c b/src/login-common/client-common.c index 0cd07027ff..89025fe33b 100644 --- a/src/login-common/client-common.c +++ b/src/login-common/client-common.c @@ -285,7 +285,7 @@ client_alloc(int fd, pool_t pool, return client; } -void client_init(struct client *client, void **other_sets) +int client_init(struct client *client, void **other_sets) { if (last_client == NULL) last_client = client; @@ -298,7 +298,8 @@ void client_init(struct client *client, void **other_sets) client_idle_disconnect_timeout, client); hook_login_client_allocated(client); - client->v.create(client, other_sets); + if (client->v.create(client, other_sets) < 0) + return -1; client->create_finished = TRUE; if (auth_client_is_connected(auth_client)) @@ -307,6 +308,7 @@ void client_init(struct client *client, void **other_sets) client_set_auth_waiting(client); login_refresh_proctitle(); + return 0; } static void client_disconnected_log(struct event *event, const char *reason, diff --git a/src/login-common/client-common.h b/src/login-common/client-common.h index 823439decc..11ba054af8 100644 --- a/src/login-common/client-common.h +++ b/src/login-common/client-common.h @@ -119,7 +119,7 @@ struct client_auth_reply { struct client_vfuncs { struct client *(*alloc)(pool_t pool); - void (*create)(struct client *client, void **other_sets); + int (*create)(struct client *client, void **other_sets); void (*destroy)(struct client *client); void (*notify_auth_ready)(struct client *client); void (*notify_disconnect)(struct client *client, @@ -319,7 +319,7 @@ client_alloc(int fd, pool_t pool, const struct login_settings *set, const struct master_service_ssl_settings *ssl_set, const struct master_service_ssl_server_settings *ssl_server_set); -void client_init(struct client *client, void **other_sets); +int client_init(struct client *client, void **other_sets); void client_disconnect(struct client *client, const char *reason, bool add_disconnected_prefix); void client_destroy(struct client *client, const char *reason); diff --git a/src/login-common/main.c b/src/login-common/main.c index 63ac7f9182..2c7f487da1 100644 --- a/src/login-common/main.c +++ b/src/login-common/main.c @@ -186,7 +186,10 @@ client_connected(struct master_service_connection *conn) return; } } - client_init(client, other_sets); + if (client_init(client, other_sets) < 0) { + client_destroy(client, "Failed to initialize client"); + return; + } client->event_auth = event_create(client->event); event_add_category(client->event_auth, &event_category_auth); event_set_min_log_level(client->event_auth, set->auth_verbose ? diff --git a/src/pop3-login/client.c b/src/pop3-login/client.c index 2e0abc2f4f..b1042344ad 100644 --- a/src/pop3-login/client.c +++ b/src/pop3-login/client.c @@ -207,9 +207,10 @@ static struct client *pop3_client_alloc(pool_t pool) return &pop3_client->common; } -static void pop3_client_create(struct client *client ATTR_UNUSED, - void **other_sets ATTR_UNUSED) +static int pop3_client_create(struct client *client ATTR_UNUSED, + void **other_sets ATTR_UNUSED) { + return 0; } static void pop3_client_destroy(struct client *client) diff --git a/src/submission-login/client.c b/src/submission-login/client.c index 42a79f3d66..6ba53caef3 100644 --- a/src/submission-login/client.c +++ b/src/submission-login/client.c @@ -90,8 +90,8 @@ static struct client *submission_client_alloc(pool_t pool) return &subm_client->common; } -static void submission_client_create(struct client *client, - void **other_sets) +static int submission_client_create(struct client *client, + void **other_sets) { static const char *const xclient_extensions[] = { "FORWARD", NULL }; @@ -122,6 +122,7 @@ static void submission_client_create(struct client *client, smtp_server, client->input, client->output, &client->real_remote_ip, client->real_remote_port, &smtp_set, &smtp_callbacks, subm_client); + return 0; } static void submission_client_destroy(struct client *client)