changeset 21919:e0a5e0b06e50

auth: Fix crash in passdb imap on connection failures
author Timo Sirainen <timo.sirainen@dovecot.fi>
date Fri, 07 Apr 2017 16:27:12 +0300
parents 2a1ffa18d91a
children 431a105349bd
files src/auth/passdb-imap.c
diffstat 1 files changed, 13 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/src/auth/passdb-imap.c	Fri Apr 07 16:13:13 2017 +0300
+++ b/src/auth/passdb-imap.c	Fri Apr 07 16:27:12 2017 +0300
@@ -1,6 +1,7 @@
 /* Copyright (c) 2011-2017 Dovecot authors, see the included COPYING file */
 
 #include "auth-common.h"
+#include "ioloop.h"
 #include "passdb.h"
 #include "str.h"
 #include "imap-resp-code.h"
@@ -20,6 +21,7 @@
 	struct imapc_client *client;
 	struct auth_request *auth_request;
 	verify_plain_callback_t *verify_callback;
+	struct timeout *to_free;
 };
 
 static enum passdb_result
@@ -38,12 +40,18 @@
 	return PASSDB_RESULT_INTERNAL_FAILURE;
 }
 
+static void passdb_imap_login_free(struct imap_auth_request *request)
+{
+	timeout_remove(&request->to_free);
+	imapc_client_deinit(&request->client);
+	auth_request_unref(&request->auth_request);
+}
+
 static void
 passdb_imap_login_callback(const struct imapc_command_reply *reply,
 			   void *context)
 {
 	struct imap_auth_request *request = context;
-	struct imapc_client *client = request->client;
 	enum passdb_result result = PASSDB_RESULT_INTERNAL_FAILURE;
 
 	switch (reply->state) {
@@ -63,8 +71,10 @@
 		break;
 	}
 	request->verify_callback(result, request->auth_request);
-	imapc_client_deinit(&client);
-	auth_request_unref(&request->auth_request);
+	/* imapc_client can't be freed in this callback, so do it in a
+	   separate callback. FIXME: remove this once imapc supports proper
+	   refcounting. */
+	request->to_free = timeout_add_short(0, passdb_imap_login_free, request);
 }
 
 static void