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