changeset 5232:7e26736a9fba HEAD

After calling sasl_callback() the client may be destroyed already. Don't try to modify it.
author Timo Sirainen <tss@iki.fi>
date Wed, 07 Mar 2007 01:59:43 +0200
parents f5c23985f946
children 359a8f31aa9b
files src/login-common/sasl-server.c
diffstat 1 files changed, 22 insertions(+), 11 deletions(-) [+]
line wrap: on
line diff
--- a/src/login-common/sasl-server.c	Wed Mar 07 01:43:27 2007 +0200
+++ b/src/login-common/sasl-server.c	Wed Mar 07 01:59:43 2007 +0200
@@ -22,12 +22,26 @@
 	return auth_flags;
 }
 
+static void
+call_client_callback(struct client *client, enum sasl_server_reply reply,
+		     const char *data, const char *const *args)
+{
+	sasl_server_callback_t *sasl_callback;
+
+	i_assert(reply != SASL_SERVER_REPLY_CONTINUE);
+
+	sasl_callback = client->sasl_callback;
+	client->sasl_callback = NULL;
+
+	sasl_callback(client, reply, data, args);
+	/* NOTE: client may be destroyed now */
+}
+
 static void master_callback(struct client *client, bool success)
 {
 	client->authenticating = FALSE;
-	client->sasl_callback(client, success ? SASL_SERVER_REPLY_SUCCESS :
-			      SASL_SERVER_REPLY_MASTER_FAILED, NULL, NULL);
-	client->sasl_callback = NULL;
+	call_client_callback(client, success ? SASL_SERVER_REPLY_SUCCESS :
+			     SASL_SERVER_REPLY_MASTER_FAILED, NULL, NULL);
 }
 
 static void authenticate_callback(struct auth_request *request, int status,
@@ -70,9 +84,8 @@
 
 		if (nologin) {
 			client->authenticating = FALSE;
-			client->sasl_callback(client, SASL_SERVER_REPLY_SUCCESS,
-					      NULL, args);
-			client->sasl_callback = NULL;
+			call_client_callback(client, SASL_SERVER_REPLY_SUCCESS,
+					     NULL, args);
 		} else {
 			master_request_login(client, master_callback,
 				auth_client_request_get_server_pid(request),
@@ -94,9 +107,8 @@
 		}
 
 		client->authenticating = FALSE;
-		client->sasl_callback(client, SASL_SERVER_REPLY_AUTH_FAILED,
-				      NULL, args);
-		client->sasl_callback = NULL;
+		call_client_callback(client, SASL_SERVER_REPLY_AUTH_FAILED,
+				     NULL, args);
 		break;
 	}
 }
@@ -168,8 +180,7 @@
 		client->auth_request = NULL;
 	}
 
-	client->sasl_callback(client, reply, reason, NULL);
-	client->sasl_callback = NULL;
+	call_client_callback(client, reply, reason, NULL);
 }
 
 void sasl_server_auth_failed(struct client *client, const char *reason)