dovecot-2.2: imap-urlauth: Fixed crashes when destroying client

dovecot at dovecot.org dovecot at dovecot.org
Sun Sep 16 16:02:59 EEST 2012


details:   http://hg.dovecot.org/dovecot-2.2/rev/dc1db2eedbb1
changeset: 15078:dc1db2eedbb1
user:      Stephan Bosch <stephan at rename-it.nl>
date:      Sun Sep 16 16:02:22 2012 +0300
description:
imap-urlauth: Fixed crashes when destroying client

diffstat:

 src/imap-urlauth/imap-urlauth-worker.c |  26 +++++++++++++++++---------
 1 files changed, 17 insertions(+), 9 deletions(-)

diffs (89 lines):

diff -r c69ee1de5f70 -r dc1db2eedbb1 src/imap-urlauth/imap-urlauth-worker.c
--- a/src/imap-urlauth/imap-urlauth-worker.c	Sun Sep 16 16:02:18 2012 +0300
+++ b/src/imap-urlauth/imap-urlauth-worker.c	Sun Sep 16 16:02:22 2012 +0300
@@ -87,7 +87,7 @@
 
 static void client_destroy(struct client *client);
 static void client_abort(struct client *client, const char *reason);
-static void client_run_url(struct client *client);
+static int client_run_url(struct client *client);
 static void client_input(struct client *client);
 static bool client_handle_input(struct client *client);
 static int client_output(struct client *client);
@@ -226,7 +226,7 @@
 		/* deinitialize url */
 		i_stream_close(client->input);
 		o_stream_close(client->output);
-		client_run_url(client);
+		(void)client_run_url(client);
 		i_assert(client->url == NULL);
 	}
 
@@ -277,7 +277,7 @@
 	master_service_client_connection_destroyed(master_service);
 }
 
-static void client_run_url(struct client *client)
+static int client_run_url(struct client *client)
 {
 	const unsigned char *data;
 	size_t size;
@@ -292,20 +292,21 @@
 			if ((ret = o_stream_flush(client->output)) < 0)
 				break;
 			if (ret == 0)
-				return;
+				return 0;
 		}
 	}
 
 	if (client->output->closed || ret < 0) {
 		imap_msgpart_url_free(&client->url);
-		client_destroy(client);
-		return;
+		return -1;
 	}
 
 	if (client->msg_part_input->eof) {
 		o_stream_send(client->output, "\n", 1);
 		imap_msgpart_url_free(&client->url);
+		return 1;
 	}
+	return 0;
 }
 
 static void clients_destroy_all(void)
@@ -480,7 +481,11 @@
 				"of %smessage data", client->msg_part_size,
 				(binary_with_nuls ? "binary " : ""));
 		}
-		client_run_url(client);
+		if (client_run_url(client) < 0) {
+			client_abort(client,
+				"Session aborted: Fatal failure while transfering URL");
+			return 0;
+		}		
 	}
 
 	if (client->url != NULL) {
@@ -740,7 +745,10 @@
 	timeout_reset(client->to_idle);
 
 	if (client->url != NULL) {
-		client_run_url(client);
+		if (client_run_url(client) < 0) {
+			client_destroy(client);
+			return 1;
+		}
 
 		if (client->url == NULL && client->waiting_input) {
 			if (!client_handle_input(client)) {
@@ -782,7 +790,7 @@
 	if (ret == 0) {
 		/* unexpectedly disconnected */
 		client_destroy(client);
-		return -1;
+		return 0;
 	} else if (ret < 0) {
 		if (errno == EAGAIN)
 			return 0;


More information about the dovecot-cvs mailing list