Mercurial > dovecot > core-2.2
changeset 14368:842e5124038d
*-login: Another crashfix
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Thu, 22 Mar 2012 16:03:04 +0200 |
parents | 1d23440ccb89 |
children | 5ae5c44b1943 |
files | src/login-common/client-common.c src/login-common/login-proxy.c src/login-common/main.c src/login-common/ssl-proxy-openssl.c src/login-common/ssl-proxy.h |
diffstat | 5 files changed, 17 insertions(+), 11 deletions(-) [+] |
line wrap: on
line diff
--- a/src/login-common/client-common.c Thu Mar 22 15:32:00 2012 +0200 +++ b/src/login-common/client-common.c Thu Mar 22 16:03:04 2012 +0200 @@ -297,7 +297,7 @@ 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,
--- a/src/login-common/login-proxy.c Thu Mar 22 15:32:00 2012 +0200 +++ b/src/login-common/login-proxy.c Thu Mar 22 16:03:04 2012 +0200 @@ -545,7 +545,7 @@ 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) {
--- a/src/login-common/main.c Thu Mar 22 15:32:00 2012 +0200 +++ b/src/login-common/main.c Thu Mar 22 16:03:04 2012 +0200 @@ -123,7 +123,7 @@ 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);
--- a/src/login-common/ssl-proxy-openssl.c Thu Mar 22 15:32:00 2012 +0200 +++ b/src/login-common/ssl-proxy-openssl.c Thu Mar 22 16:03:04 2012 +0200 @@ -52,6 +52,7 @@ 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 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 @@ 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 @@ 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 @@ SSL_free(proxy->ssl); + pool_unref(&proxy->set_pool); i_free(proxy->last_error); i_free(proxy); }
--- a/src/login-common/ssl-proxy.h Thu Mar 22 15:32:00 2012 +0200 +++ b/src/login-common/ssl-proxy.h Thu Mar 22 16:03:04 2012 +0200 @@ -13,10 +13,10 @@ /* 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);