dovecot-2.2: *-login: Another crashfix

dovecot at dovecot.org dovecot at dovecot.org
Sun May 20 03:26:29 EEST 2012


details:   http://hg.dovecot.org/dovecot-2.2/rev/842e5124038d
changeset: 14368:842e5124038d
user:      Timo Sirainen <tss at iki.fi>
date:      Thu Mar 22 16:03:04 2012 +0200
description:
*-login: Another crashfix

diffstat:

 src/login-common/client-common.c     |   2 +-
 src/login-common/login-proxy.c       |   2 +-
 src/login-common/main.c              |   2 +-
 src/login-common/ssl-proxy-openssl.c |  18 ++++++++++++------
 src/login-common/ssl-proxy.h         |   4 ++--
 5 files changed, 17 insertions(+), 11 deletions(-)

diffs (122 lines):

diff -r 1d23440ccb89 -r 842e5124038d src/login-common/client-common.c
--- 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,
diff -r 1d23440ccb89 -r 842e5124038d src/login-common/login-proxy.c
--- 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) {
diff -r 1d23440ccb89 -r 842e5124038d src/login-common/main.c
--- 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);
diff -r 1d23440ccb89 -r 842e5124038d src/login-common/ssl-proxy-openssl.c
--- 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);
 }
diff -r 1d23440ccb89 -r 842e5124038d src/login-common/ssl-proxy.h
--- 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);


More information about the dovecot-cvs mailing list