svn commit: samba r7782 - in branches/SAMBA_4_0/source/smb_server: .

tridge at samba.org tridge at samba.org
Mon Jun 20 08:47:53 GMT 2005


Author: tridge
Date: 2005-06-20 08:47:52 +0000 (Mon, 20 Jun 2005)
New Revision: 7782

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

Log:
fixed an ordering problem with smb requests. I found this when I had "sam database"
set to the internal ldap server over loopback. The following happened:

  - DCERPC_AUTH3 request
     - auth requests calls ldb
     - ldb calls ldap
     - ldap calls our internal ldap server, triggering events
  - samrConnect from client
     - connect refused
  - SMBclose from client
     - causes dcerpc_pipe to be destroyed
  - AUTH3 continues
     - dies on freed pipe

I chose this solution as it provides a guarantee that backends only have to think about
async issues when they mark a request async. When they don't, this code guarantees that
a second request won't happen on the same connection while processing the first one

Modified:
   branches/SAMBA_4_0/source/smb_server/smb_server.c
   branches/SAMBA_4_0/source/smb_server/smb_server.h


Changeset:
Modified: branches/SAMBA_4_0/source/smb_server/smb_server.c
===================================================================
--- branches/SAMBA_4_0/source/smb_server/smb_server.c	2005-06-20 06:15:35 UTC (rev 7781)
+++ branches/SAMBA_4_0/source/smb_server/smb_server.c	2005-06-20 08:47:52 UTC (rev 7782)
@@ -665,7 +665,18 @@
 
 	DEBUG(10,("smbsrv_recv\n"));
 
+	/* our backends are designed to process one request at a time,
+	   unless they deliberately mark the request as async and
+	   process it later on a timer or other event. This enforces
+	   that ordering. */
+	if (smb_conn->processing) {
+		EVENT_FD_NOT_READABLE(conn->event.fde);
+		return;
+	}
+
+	smb_conn->processing = True;
 	status = receive_smb_request(smb_conn);
+	smb_conn->processing = False;
 	if (NT_STATUS_IS_ERR(status)) {
 		talloc_free(conn->event.fde);
 		conn->event.fde = NULL;
@@ -673,6 +684,8 @@
 		return;
 	}
 
+	EVENT_FD_READABLE(conn->event.fde);
+
 	/* free up temporary memory */
 	lp_talloc_free();
 }
@@ -749,6 +762,7 @@
 	smbsrv_tcon_init(smb_conn);
 
 	smb_conn->connection = conn;
+	smb_conn->processing = False;
 
 	conn->private = smb_conn;
 }

Modified: branches/SAMBA_4_0/source/smb_server/smb_server.h
===================================================================
--- branches/SAMBA_4_0/source/smb_server/smb_server.h	2005-06-20 06:15:35 UTC (rev 7781)
+++ branches/SAMBA_4_0/source/smb_server/smb_server.h	2005-06-20 08:47:52 UTC (rev 7782)
@@ -254,4 +254,6 @@
 		struct smb_trans2 *trans;
 		uint8_t command;
 	} *trans_partial;
+
+	BOOL processing;
 };



More information about the samba-cvs mailing list