svn commit: samba r11487 - in branches/SAMBA_4_0/source/libcli/wrepl: .

metze at samba.org metze at samba.org
Thu Nov 3 18:38:42 GMT 2005


Author: metze
Date: 2005-11-03 18:38:41 +0000 (Thu, 03 Nov 2005)
New Revision: 11487

WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=11487

Log:
thanks to make test I noticed a dead lock bug, in the last change,
this only happens with socket_wrapper as socket_connect() returns NT_STATUS_OK
instead of NT_STATUS_MORE_PROCESSING_REQUIRED, and we missed to replace the
fde event handler...

metze 
Modified:
   branches/SAMBA_4_0/source/libcli/wrepl/winsrepl.c


Changeset:
Modified: branches/SAMBA_4_0/source/libcli/wrepl/winsrepl.c
===================================================================
--- branches/SAMBA_4_0/source/libcli/wrepl/winsrepl.c	2005-11-03 18:01:47 UTC (rev 11486)
+++ branches/SAMBA_4_0/source/libcli/wrepl/winsrepl.c	2005-11-03 18:38:41 UTC (rev 11487)
@@ -433,7 +433,7 @@
 	return req->status;
 }
 
-static void wrepl_request_trigger(struct wrepl_request *req);
+static void wrepl_request_trigger(struct wrepl_request *req, NTSTATUS status);
 
 /*
   connect a wrepl_socket to a WINS server
@@ -450,7 +450,7 @@
 	req->wrepl_socket = wrepl_socket;
 	req->state        = WREPL_REQUEST_RECV;
 
-	DLIST_ADD(wrepl_socket->recv_queue, req);
+	DLIST_ADD_END(wrepl_socket->recv_queue, req, struct wrepl_request *);
 
 	talloc_set_destructor(req, wrepl_request_destructor);
 
@@ -460,11 +460,21 @@
 
 	status = socket_connect(wrepl_socket->sock, our_ip, 0, peer_ip, 
 				WINS_REPLICATION_PORT, 0);
+	if (NT_STATUS_IS_OK(status)) {
+		talloc_free(wrepl_socket->fde);
+
+		wrepl_socket->fde = event_add_fd(wrepl_socket->event_ctx, wrepl_socket, 
+						 socket_get_fd(wrepl_socket->sock), 
+						 EVENT_FD_WRITE,
+						 wrepl_handler, wrepl_socket);
+		if (wrepl_socket->fde == NULL) {
+			status = NT_STATUS_NO_MEMORY;
+		}
+	}
+
 	if (!NT_STATUS_EQUAL(status, NT_STATUS_MORE_PROCESSING_REQUIRED)) {
 		req->wrepl_socket = wrepl_socket;
-		req->state        = WREPL_REQUEST_ERROR;
-		req->status       = status;
-		wrepl_request_trigger(req);
+		wrepl_request_trigger(req, status);
 		return req;
 	}
 
@@ -500,9 +510,6 @@
 					  struct timeval t, void *ptr)
 {
 	struct wrepl_request *req = talloc_get_type(ptr, struct wrepl_request);
-	struct wrepl_socket *wrepl_socket = req->wrepl_socket;
-	DLIST_REMOVE(wrepl_socket->send_queue, req);
-	DLIST_REMOVE(wrepl_socket->recv_queue, req);
 	if (req->async.fn) {
 		req->async.fn(req);
 	}
@@ -511,8 +518,23 @@
 /*
   trigger an immediate event on a wrepl_request
 */
-static void wrepl_request_trigger(struct wrepl_request *req)
+static void wrepl_request_trigger(struct wrepl_request *req, NTSTATUS status)
 {
+	if (req->state == WREPL_REQUEST_SEND) {
+		DLIST_REMOVE(req->wrepl_socket->send_queue, req);
+	}
+	if (req->state == WREPL_REQUEST_RECV) {
+		DLIST_REMOVE(req->wrepl_socket->recv_queue, req);
+	}
+
+	if (!NT_STATUS_IS_OK(status)) {
+		req->state	= WREPL_REQUEST_ERROR;
+	} else {
+		req->state	= WREPL_REQUEST_DONE;
+	}
+
+	req->status	= status;
+
 	/* a zero timeout means immediate */
 	event_add_timed(req->wrepl_socket->event_ctx,
 			req, timeval_zero(),
@@ -532,17 +554,19 @@
 	req = talloc_zero(wrepl_socket, struct wrepl_request);
 	if (req == NULL) goto failed;
 
+	req->wrepl_socket = wrepl_socket;
+	req->state        = WREPL_REQUEST_SEND;
+
+	DLIST_ADD_END(wrepl_socket->send_queue, req, struct wrepl_request *);
+
+	talloc_set_destructor(req, wrepl_request_destructor);
+
 	if (wrepl_socket->dead) {
 		req->wrepl_socket = wrepl_socket;
-		req->state        = WREPL_REQUEST_ERROR;
-		req->status       = NT_STATUS_INVALID_CONNECTION;
-		wrepl_request_trigger(req);
+		wrepl_request_trigger(req, NT_STATUS_INVALID_CONNECTION);
 		return req;
 	}
 
-	req->wrepl_socket = wrepl_socket;
-	req->state        = WREPL_REQUEST_SEND;
-
 	wrap.packet = *packet;
 	req->status = ndr_push_struct_blob(&req->buffer, req, &wrap,
 					   (ndr_push_flags_fn_t)ndr_push_wrepl_wrap);
@@ -553,10 +577,6 @@
 		NDR_PRINT_DEBUG(wrepl_packet, &wrap.packet);
 	}
 
-	DLIST_ADD(wrepl_socket->send_queue, req);
-
-	talloc_set_destructor(req, wrepl_request_destructor);
-
 	if (wrepl_socket->request_timeout > 0) {
 		req->te = event_add_timed(wrepl_socket->event_ctx, req, 
 					  timeval_current_ofs(wrepl_socket->request_timeout, 0), 



More information about the samba-cvs mailing list