r7800: added the same request serialisation logic to our socket based rpc
authorAndrew Tridgell <tridge@samba.org>
Tue, 21 Jun 2005 06:03:11 +0000 (06:03 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 18:18:37 +0000 (13:18 -0500)
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
(This used to be commit 8546adb56aa4dda608a176409c243b074aeca77d)

source4/rpc_server/dcerpc_server.c
source4/rpc_server/dcerpc_server.h
source4/rpc_server/dcerpc_sock.c

index 700892b49c6e720d50431ecabdf354b38304a778..f4059e4a4646ee080bb972b96a46ec14310f8fa2 100644 (file)
@@ -320,6 +320,7 @@ NTSTATUS dcesrv_endpoint_connect(struct dcesrv_context *dce_ctx,
        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);
 
index efcb7f9127256e4fd214b3a2888ec1f418fc320c..96ef418a5b57a4d9895959febe5c6a88eab80a40 100644 (file)
@@ -177,6 +177,8 @@ struct dcesrv_connection {
 
        /* the transport level session key */
        DATA_BLOB transport_session_key;
+
+       BOOL processing;
 };
 
 
index db709ac5e903ea12b23836720d8be7066795253c..130f85c0ee6afb89a4ef14725f777f4218c63a77 100644 (file)
@@ -87,6 +87,11 @@ static void dcesrv_sock_recv(struct stream_connection *conn, uint16_t flags)
        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 @@ static void dcesrv_sock_recv(struct stream_connection *conn, uint16_t flags)
 
        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;