[dovecot-cvs] dovecot/src/login-common sasl-server.c,1.16,1.17

tss at dovecot.org tss at dovecot.org
Wed Mar 7 01:59:46 EET 2007


Update of /var/lib/cvs/dovecot/src/login-common
In directory talvi:/tmp/cvs-serv10425

Modified Files:
	sasl-server.c 
Log Message:
After calling sasl_callback() the client may be destroyed already. Don't try
to modify it.



Index: sasl-server.c
===================================================================
RCS file: /var/lib/cvs/dovecot/src/login-common/sasl-server.c,v
retrieving revision 1.16
retrieving revision 1.17
diff -u -d -r1.16 -r1.17
--- sasl-server.c	16 Feb 2007 13:40:48 -0000	1.16
+++ sasl-server.c	6 Mar 2007 23:59:43 -0000	1.17
@@ -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)



More information about the dovecot-cvs mailing list