dovecot-2.0: lib-auth: Make sure auth request isn't tried to be ...

dovecot at dovecot.org dovecot at dovecot.org
Mon Sep 20 21:06:33 EEST 2010


details:   http://hg.dovecot.org/dovecot-2.0/rev/af45e2f36059
changeset: 12139:af45e2f36059
user:      Timo Sirainen <tss at iki.fi>
date:      Mon Sep 20 19:06:26 2010 +0100
description:
lib-auth: Make sure auth request isn't tried to be double-freed on error conditions.
This could have happened if auth server crashed.

diffstat:

 src/lib-auth/auth-client-request.c |  22 ++++++++++++++--------
 1 files changed, 14 insertions(+), 8 deletions(-)

diffs (45 lines):

diff -r e403f4dc95ea -r af45e2f36059 src/lib-auth/auth-client-request.c
--- a/src/lib-auth/auth-client-request.c	Mon Sep 20 18:19:53 2010 +0100
+++ b/src/lib-auth/auth-client-request.c	Mon Sep 20 19:06:26 2010 +0100
@@ -112,19 +112,25 @@
 		i_error("Error sending continue request to auth server: %m");
 }
 
+static void call_callback(struct auth_client_request *request,
+			  enum auth_request_status status,
+			  const char *data_base64,
+			  const char *const *args)
+{
+	auth_request_callback_t *callback = request->callback;
+
+	request->callback = NULL;
+	callback(request, status, data_base64, args, request->context);
+}
+
 void auth_client_request_abort(struct auth_client_request **_request)
 {
 	struct auth_client_request *request = *_request;
-	const char *str = t_strdup_printf("CANCEL\t%u\n", request->id);
 
 	*_request = NULL;
 
-	if (o_stream_send_str(request->conn->output, str) < 0)
-		i_error("Error sending request to auth server: %m");
-
-	request->callback(request, AUTH_REQUEST_STATUS_FAIL, NULL, NULL,
-			  request->context);
-	request->callback = NULL;
+	auth_client_send_cancel(request->conn->client, request->id);
+	call_callback(request, AUTH_REQUEST_STATUS_FAIL, NULL, NULL);
 }
 
 unsigned int auth_client_request_get_id(struct auth_client_request *request)
@@ -176,7 +182,7 @@
 		break;
 	}
 
-	request->callback(request, status, base64_data, args, request->context);
+	call_callback(request, status, base64_data, args);
 	if (status != AUTH_REQUEST_STATUS_CONTINUE)
 		pool_unref(&request->pool);
 }


More information about the dovecot-cvs mailing list