[dovecot-cvs] dovecot/src/lib-auth auth-server-connection.c,1.2,1.3 auth-server-connection.h,1.1,1.2 auth-server-request.c,1.3,1.4

cras at procontrol.fi cras at procontrol.fi
Fri Aug 22 10:37:59 EEST 2003


Update of /home/cvs/dovecot/src/lib-auth
In directory danu:/tmp/cvs-serv11641/lib-auth

Modified Files:
	auth-server-connection.c auth-server-connection.h 
	auth-server-request.c 
Log Message:
fixes



Index: auth-server-connection.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib-auth/auth-server-connection.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- auth-server-connection.c	22 Aug 2003 03:34:04 -0000	1.2
+++ auth-server-connection.c	22 Aug 2003 06:37:57 -0000	1.3
@@ -19,6 +19,8 @@
 	(sizeof(struct auth_client_request_continue) + \
 	 AUTH_CLIENT_MAX_REQUEST_DATA_SIZE)
 
+static void auth_server_connection_unref(struct auth_server_connection *conn);
+
 static void update_available_auth_mechs(struct auth_client *client)
 {
 	struct auth_server_connection *conn;
@@ -104,9 +106,13 @@
 		return;
 
 	/* we've got a full reply */
+	conn->refcount++;
 	conn->reply_received = FALSE;
+
 	auth_server_request_handle_reply(conn, &conn->reply, data);
 	i_stream_skip(conn->input, conn->reply.data_size);
+
+	auth_server_connection_unref(conn);
 }
 
 struct auth_server_connection *
@@ -128,6 +134,7 @@
 
 	pool = pool_alloconly_create("Auth connection", 1024);
 	conn = p_new(pool, struct auth_server_connection, 1);
+	conn->refcount = 1;
 	conn->pool = pool;
 
 	conn->client = client;
@@ -163,6 +170,9 @@
 	struct auth_client *client = conn->client;
 	struct auth_server_connection **pos;
 
+	if (conn->fd == -1)
+		return;
+
         pos = &conn->client->connections;
 	for (; *pos != NULL; pos = &(*pos)->next) {
 		if (*pos == conn) {
@@ -175,16 +185,17 @@
 		client->conn_waiting_handshake_count--;
 
 	io_remove(conn->io);
+	conn->io = NULL;
+
+	i_stream_close(conn->input);
+	o_stream_close(conn->output);
+
 	if (close(conn->fd) < 0)
 		i_error("close(auth) failed: %m");
 	conn->fd = -1;
 
 	auth_server_requests_remove_all(conn);
-	hash_destroy(conn->requests);
-
-	i_stream_unref(conn->input);
-	o_stream_unref(conn->output);
-	pool_unref(conn->pool);
+        auth_server_connection_unref(conn);
 
 	if (reconnect)
 		auth_client_connect_missing_servers(client);
@@ -193,6 +204,18 @@
 				auth_client_is_connected(client),
 				client->connect_notify_context);
 	}
+}
+
+static void auth_server_connection_unref(struct auth_server_connection *conn)
+{
+	if (--conn->refcount > 0)
+		return;
+
+	hash_destroy(conn->requests);
+
+	i_stream_unref(conn->input);
+	o_stream_unref(conn->output);
+	pool_unref(conn->pool);
 }
 
 struct auth_server_connection *

Index: auth-server-connection.h
===================================================================
RCS file: /home/cvs/dovecot/src/lib-auth/auth-server-connection.h,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -d -r1.1 -r1.2
--- auth-server-connection.h	22 Aug 2003 02:42:13 -0000	1.1
+++ auth-server-connection.h	22 Aug 2003 06:37:57 -0000	1.2
@@ -20,6 +20,8 @@
 	struct auth_server_connection *next;
 
 	pool_t pool;
+	int refcount;
+
 	struct auth_client *client;
 	const char *path;
 	int fd;

Index: auth-server-request.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib-auth/auth-server-request.c,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -d -r1.3 -r1.4
--- auth-server-request.c	22 Aug 2003 04:42:13 -0000	1.3
+++ auth-server-request.c	22 Aug 2003 06:37:57 -0000	1.4
@@ -47,6 +47,26 @@
 	return TRUE;
 }
 
+static void auth_server_send_continue(struct auth_server_connection *conn,
+				      struct auth_request *request,
+				      const unsigned char *data, size_t size)
+{
+	struct auth_client_request_continue auth_request;
+
+	/* send continued request to auth */
+	auth_request.type = AUTH_CLIENT_REQUEST_CONTINUE;
+	auth_request.id = request->id;
+	auth_request.data_size = size;
+
+	if (o_stream_send(conn->output, &auth_request,
+			  sizeof(auth_request)) < 0 ||
+	    o_stream_send(conn->output, data, size) < 0) {
+		errno = conn->output->stream_errno;
+		i_warning("Error sending continue request to auth server: %m");
+		auth_server_connection_destroy(conn, TRUE);
+	}
+}
+
 static struct auth_server_connection *
 get_next_plain_server(struct auth_server_connection *conn)
 {
@@ -68,37 +88,43 @@
 
 	request = hash_lookup(conn->requests, POINTER_CAST(reply->id));
 	if (request == NULL) {
-		i_error("BUG: Auth server sent us reply with unknown ID %u",
-			reply->id);
+		/* We've already destroyed the request */
 		return;
 	}
 
 	switch (reply->result) {
 	case AUTH_CLIENT_RESULT_SUCCESS:
-		if (conn == request->conn)
-			request->next_conn = NULL;
-		else {
-			i_assert(request->next_conn == conn);
-			request->conn = request->next_conn;
-			request->next_conn = NULL;
+		hash_remove(request->conn->requests, POINTER_CAST(request->id));
+		if (request->next_conn != NULL) {
+			hash_remove(request->next_conn->requests,
+				    POINTER_CAST(request->id));
 		}
+		request->conn = conn;
+		request->next_conn = NULL;
 		break;
 	case AUTH_CLIENT_RESULT_FAILURE:
-		if (request->plaintext_data == NULL)
-			break;
-
-		next = get_next_plain_server(conn);
-		if (next == NULL)
+		hash_remove(conn->requests, POINTER_CAST(request->id));
+		if (!request->retrying)
 			break;
 
-		hash_remove(conn->requests, POINTER_CAST(request->id));
-		hash_insert(next->requests, POINTER_CAST(request->id), request);
+		next = request->next_conn == NULL ? NULL :
+			get_next_plain_server(request->next_conn);
 
 		if (conn == request->conn)
 			request->conn = request->next_conn;
+		request->next_conn = NULL;
+
+		if (next == NULL) {
+			if (request->conn != NULL) {
+				/* the other one hasn't replied yet */
+				return;
+			}
+			request->conn = conn;
+			break;
+		}
 
+		hash_insert(next->requests, POINTER_CAST(request->id), request);
 		request->next_conn = next;
-		request->retrying = TRUE;
 
 		auth_server_send_new_request(next, request);
 		return;
@@ -106,15 +132,15 @@
 		if (!request->retrying)
 			break;
 
-		auth_client_request_continue(request, request->plaintext_data,
-					     request->plaintext_data_size);
+		auth_server_send_continue(conn, request,
+					  request->plaintext_data,
+					  request->plaintext_data_size);
 		return;
 	}
 
 	request->callback(request, reply, data, request->context);
 
 	if (reply->result != AUTH_CLIENT_RESULT_CONTINUE) {
-		hash_remove(conn->requests, POINTER_CAST(request->id));
 		i_free(request->plaintext_data);
 		i_free(request);
 	}
@@ -169,7 +195,7 @@
 void auth_client_request_continue(struct auth_request *request,
 				  const unsigned char *data, size_t data_size)
 {
-	struct auth_client_request_continue auth_request;
+	auth_server_send_continue(request->conn, request, data, data_size);
 
 	if (request->mech == AUTH_MECH_PLAIN &&
 	    request->plaintext_data == NULL) {
@@ -185,20 +211,8 @@
 				    POINTER_CAST(request->id), request);
 			auth_server_send_new_request(request->next_conn,
 						     request);
+			request->retrying = TRUE;
 		}
-	}
-
-	/* send continued request to auth */
-	auth_request.type = AUTH_CLIENT_REQUEST_CONTINUE;
-	auth_request.id = request->id;
-	auth_request.data_size = data_size;
-
-	if (o_stream_send(request->conn->output, &auth_request,
-			  sizeof(auth_request)) < 0 ||
-	    o_stream_send(request->conn->output, data, data_size) < 0) {
-		errno = request->conn->output->stream_errno;
-		i_warning("Error sending continue request to auth server: %m");
-		auth_server_connection_destroy(request->conn, TRUE);
 	}
 }
 



More information about the dovecot-cvs mailing list