From: Aki Tuomi Date: Thu, 9 Mar 2017 12:08:40 +0000 (+0200) Subject: login-common: Add preproxy pool X-Git-Tag: 2.3.0.rc1~1928 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b045b66988bfbaa2795791e42ee724fae6f0db1c;p=thirdparty%2Fdovecot%2Fcore.git login-common: Add preproxy pool preproxy pool can be used to do allocations that are released once proxying starts. --- diff --git a/src/login-common/client-common.c b/src/login-common/client-common.c index 599a0e3e11..7bb23831df 100644 --- a/src/login-common/client-common.c +++ b/src/login-common/client-common.c @@ -172,6 +172,7 @@ client_create(int fd, bool ssl, pool_t pool, client->refcount = 1; client->pool = pool; + client->preproxy_pool = pool_alloconly_create(MEMPOOL_GROWING"preproxy pool", 256); client->set = set; client->ssl_set = ssl_set; p_array_init(&client->module_contexts, client->pool, 5); @@ -222,6 +223,9 @@ void client_destroy(struct client *client, const char *reason) return; client->destroyed = TRUE; + if (client->preproxy_pool != NULL) + pool_unref(&client->preproxy_pool); + if (!client->login_success && reason != NULL) { reason = t_strconcat(reason, " ", client_get_extra_disconnect_reason(client), NULL); diff --git a/src/login-common/client-common.h b/src/login-common/client-common.h index 4dc3db7622..41eb9728d6 100644 --- a/src/login-common/client-common.h +++ b/src/login-common/client-common.h @@ -124,6 +124,8 @@ struct client_vfuncs { struct client { struct client *prev, *next; pool_t pool; + /* this pool gets free'd once proxying starts */ + pool_t preproxy_pool; struct client_vfuncs v; struct client_vfuncs *vlast; diff --git a/src/login-common/login-proxy.c b/src/login-common/login-proxy.c index 8ae7bdba7e..80553e3786 100644 --- a/src/login-common/login-proxy.c +++ b/src/login-common/login-proxy.c @@ -700,6 +700,9 @@ void login_proxy_detach(struct login_proxy *proxy) const unsigned char *data; size_t size; + if (proxy->client->preproxy_pool != NULL) + pool_unref(&proxy->client->preproxy_pool); + i_assert(proxy->client_fd == -1); i_assert(proxy->server_input != NULL); i_assert(proxy->server_output != NULL);