From: Timo Sirainen Date: Thu, 22 Mar 2012 14:03:04 +0000 (+0200) Subject: *-login: Another crashfix X-Git-Tag: 2.1.4~70 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5da4bfdce070b54ce8dfcd1bf6249798cda86bd6;p=thirdparty%2Fdovecot%2Fcore.git *-login: Another crashfix --- diff --git a/src/login-common/client-common.c b/src/login-common/client-common.c index fdcd46cb70..1cfabb0444 100644 --- a/src/login-common/client-common.c +++ b/src/login-common/client-common.c @@ -297,7 +297,7 @@ static void client_start_tls(struct client *client) if (!client_unref(&client) || client->destroyed) return; - fd_ssl = ssl_proxy_alloc(client->fd, &client->ip, + fd_ssl = ssl_proxy_alloc(client->fd, &client->ip, client->pool, client->set, &client->ssl_proxy); if (fd_ssl == -1) { client_send_line(client, CLIENT_CMD_REPLY_BYE, diff --git a/src/login-common/login-proxy.c b/src/login-common/login-proxy.c index 19d6b558d3..22ccecac82 100644 --- a/src/login-common/login-proxy.c +++ b/src/login-common/login-proxy.c @@ -545,7 +545,7 @@ int login_proxy_starttls(struct login_proxy *proxy) io_remove(&proxy->server_io); fd = ssl_proxy_client_alloc(proxy->server_fd, &proxy->client->ip, - proxy->client->set, + proxy->client->pool, proxy->client->set, login_proxy_ssl_handshaked, proxy, &proxy->ssl_server_proxy); if (fd < 0) { diff --git a/src/login-common/main.c b/src/login-common/main.c index 16cda87913..542eb708c1 100644 --- a/src/login-common/main.c +++ b/src/login-common/main.c @@ -123,7 +123,7 @@ client_connected_finish(const struct master_service_connection *conn) client = client_create(conn->fd, FALSE, pool, set, other_sets, &local_ip, &conn->remote_ip); } else { - fd_ssl = ssl_proxy_alloc(conn->fd, &conn->remote_ip, set, + fd_ssl = ssl_proxy_alloc(conn->fd, &conn->remote_ip, pool, set, &proxy); if (fd_ssl == -1) { net_disconnect(conn->fd); diff --git a/src/login-common/ssl-proxy-openssl.c b/src/login-common/ssl-proxy-openssl.c index 9759d3dc18..2c549dfb24 100644 --- a/src/login-common/ssl-proxy-openssl.c +++ b/src/login-common/ssl-proxy-openssl.c @@ -52,6 +52,7 @@ struct ssl_proxy { struct client *client; struct ip_addr ip; const struct login_settings *set; + pool_t set_pool; int fd_ssl, fd_plain; struct io *io_ssl_read, *io_ssl_write, *io_plain_read, *io_plain_write; @@ -543,7 +544,7 @@ static void ssl_step(struct ssl_proxy *proxy) static int ssl_proxy_alloc_common(SSL_CTX *ssl_ctx, int fd, const struct ip_addr *ip, - const struct login_settings *set, + pool_t set_pool, const struct login_settings *set, struct ssl_proxy **proxy_r) { struct ssl_proxy *proxy; @@ -590,7 +591,9 @@ ssl_proxy_alloc_common(SSL_CTX *ssl_ctx, int fd, const struct ip_addr *ip, proxy->fd_ssl = fd; proxy->fd_plain = sfd[0]; proxy->ip = *ip; - SSL_set_ex_data(ssl, extdata_index, proxy); + proxy->set_pool = set_pool; + pool_ref(set_pool); + SSL_set_ex_data(ssl, extdata_index, proxy); ssl_proxy_count++; DLLIST_PREPEND(&ssl_proxies, proxy); @@ -618,24 +621,26 @@ ssl_server_context_get(const struct login_settings *set) return ctx; } -int ssl_proxy_alloc(int fd, const struct ip_addr *ip, +int ssl_proxy_alloc(int fd, const struct ip_addr *ip, pool_t set_pool, const struct login_settings *set, struct ssl_proxy **proxy_r) { struct ssl_server_context *ctx; ctx = ssl_server_context_get(set); - return ssl_proxy_alloc_common(ctx->ctx, fd, ip, set, proxy_r); + return ssl_proxy_alloc_common(ctx->ctx, fd, ip, + set_pool, set, proxy_r); } -int ssl_proxy_client_alloc(int fd, struct ip_addr *ip, +int ssl_proxy_client_alloc(int fd, struct ip_addr *ip, pool_t set_pool, const struct login_settings *set, ssl_handshake_callback_t *callback, void *context, struct ssl_proxy **proxy_r) { int ret; - ret = ssl_proxy_alloc_common(ssl_client_ctx, fd, ip, set, proxy_r); + ret = ssl_proxy_alloc_common(ssl_client_ctx, fd, ip, + set_pool, set, proxy_r); if (ret < 0) return -1; @@ -767,6 +772,7 @@ static void ssl_proxy_unref(struct ssl_proxy *proxy) SSL_free(proxy->ssl); + pool_unref(&proxy->set_pool); i_free(proxy->last_error); i_free(proxy); } diff --git a/src/login-common/ssl-proxy.h b/src/login-common/ssl-proxy.h index aaa6ea3132..6a97183a00 100644 --- a/src/login-common/ssl-proxy.h +++ b/src/login-common/ssl-proxy.h @@ -13,10 +13,10 @@ typedef int ssl_handshake_callback_t(void *context); /* establish SSL connection with the given fd, returns a new fd which you must use from now on, or -1 if error occurred. Unless -1 is returned, the given fd must be simply forgotten. */ -int ssl_proxy_alloc(int fd, const struct ip_addr *ip, +int ssl_proxy_alloc(int fd, const struct ip_addr *ip, pool_t set_pool, const struct login_settings *set, struct ssl_proxy **proxy_r); -int ssl_proxy_client_alloc(int fd, struct ip_addr *ip, +int ssl_proxy_client_alloc(int fd, struct ip_addr *ip, pool_t set_pool, const struct login_settings *set, ssl_handshake_callback_t *callback, void *context, struct ssl_proxy **proxy_r);