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

source/rpc_server/dcerpc_server.c
source/rpc_server/dcerpc_server.h
source/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;