Author: tridge Date: 2005-06-21 06:03:11 +0000 (Tue, 21 Jun 2005) New Revision: 7800
WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=7800 Log: added the same request serialisation logic to our socket based rpc servers as I added to the smb server yesterday. This means rpc server code can assume it runs serially unless it explicitly sets the async flag on the request and returns Modified: branches/SAMBA_4_0/source/rpc_server/dcerpc_server.c branches/SAMBA_4_0/source/rpc_server/dcerpc_server.h branches/SAMBA_4_0/source/rpc_server/dcerpc_sock.c Changeset: Modified: branches/SAMBA_4_0/source/rpc_server/dcerpc_server.c =================================================================== --- branches/SAMBA_4_0/source/rpc_server/dcerpc_server.c 2005-06-21 05:27:09 UTC (rev 7799) +++ branches/SAMBA_4_0/source/rpc_server/dcerpc_server.c 2005-06-21 06:03:11 UTC (rev 7800) @@ -320,6 +320,7 @@ p->auth_state.session_info = NULL; p->auth_state.session_key = dcesrv_generic_session_key; p->srv_conn = srv_conn; + p->processing = False; talloc_set_destructor(p, dcesrv_endpoint_destructor); Modified: branches/SAMBA_4_0/source/rpc_server/dcerpc_server.h =================================================================== --- branches/SAMBA_4_0/source/rpc_server/dcerpc_server.h 2005-06-21 05:27:09 UTC (rev 7799) +++ branches/SAMBA_4_0/source/rpc_server/dcerpc_server.h 2005-06-21 06:03:11 UTC (rev 7800) @@ -177,6 +177,8 @@ /* the transport level session key */ DATA_BLOB transport_session_key; + + BOOL processing; }; Modified: branches/SAMBA_4_0/source/rpc_server/dcerpc_sock.c =================================================================== --- branches/SAMBA_4_0/source/rpc_server/dcerpc_sock.c 2005-06-21 05:27:09 UTC (rev 7799) +++ branches/SAMBA_4_0/source/rpc_server/dcerpc_sock.c 2005-06-21 06:03:11 UTC (rev 7800) @@ -87,6 +87,11 @@ DATA_BLOB tmp_blob; size_t nread; + if (dce_conn->processing) { + EVENT_FD_NOT_READABLE(conn->event.fde); + return; + } + tmp_blob = data_blob_talloc(conn->socket, NULL, 0x1000); if (tmp_blob.data == NULL) { dcesrv_terminate_connection(dce_conn, "out of memory"); @@ -105,9 +110,13 @@ tmp_blob.length = nread; + dce_conn->processing = True; status = dcesrv_input(dce_conn, &tmp_blob); + dce_conn->processing = False; talloc_free(tmp_blob.data); + EVENT_FD_READABLE(conn->event.fde); + if (!NT_STATUS_IS_OK(status)) { dcesrv_terminate_connection(dce_conn, nt_errstr(status)); return;
