s3-rpc: split process_complete_pdu from process_incoming_data
authorDavid Disseldorp <ddiss@samba.org>
Tue, 24 Apr 2012 17:49:59 +0000 (19:49 +0200)
committerDavid Disseldorp <ddiss@samba.org>
Mon, 15 Apr 2013 16:15:16 +0000 (18:15 +0200)
In preparation for making process_complete_pdu() asynchronous.

source3/rpc_server/rpc_server.c
source3/rpc_server/srv_pipe_hnd.c
source3/rpc_server/srv_pipe_hnd.h

index 1a5fa57d38c42d6ab941ed2797e69d7ca616756a..d64b13722b3396a1c4b0e324c68650ed11a93a73 100644 (file)
@@ -442,8 +442,10 @@ static void named_pipe_packet_process(struct tevent_req *subreq)
        data = (char *)recv_buffer.data;
 
        while (data_left) {
+               bool pdu_ready = false;
 
-               data_used = process_incoming_data(npc->p, data, data_left);
+               data_used = process_incoming_data(npc->p, data, data_left,
+                                                 &pdu_ready);
                if (data_used < 0) {
                        DEBUG(3, ("Failed to process dceprc request!\n"));
                        status = NT_STATUS_UNEXPECTED_IO_ERROR;
@@ -452,6 +454,11 @@ static void named_pipe_packet_process(struct tevent_req *subreq)
 
                data_left -= data_used;
                data += data_used;
+
+               if (pdu_ready == true) {
+                       process_complete_pdu(npc->p);
+                       break;
+               }
        }
 
        /* Do not leak this buffer, npc is a long lived context */
@@ -1149,7 +1156,10 @@ static void dcerpc_ncacn_packet_process(struct tevent_req *subreq)
        data = (char *) recv_buffer.data;
 
        while (data_left) {
-               data_used = process_incoming_data(ncacn_conn->p, data, data_left);
+               bool pdu_ready = false;
+
+               data_used = process_incoming_data(ncacn_conn->p, data,
+                                                 data_left, &pdu_ready);
                if (data_used < 0) {
                        DEBUG(3, ("Failed to process dcerpc request!\n"));
                        status = NT_STATUS_UNEXPECTED_IO_ERROR;
@@ -1158,6 +1168,11 @@ static void dcerpc_ncacn_packet_process(struct tevent_req *subreq)
 
                data_left -= data_used;
                data += data_used;
+
+               if (pdu_ready == true) {
+                       process_complete_pdu(ncacn_conn->p);
+                       break;
+               }
        }
 
        /* Do not leak this buffer */
index 0c615bdc3708b1914c8b1c6b9d613bdebfde6122..937e81beb8dd1c848820a0b0e2b785e090013b2b 100644 (file)
@@ -125,12 +125,15 @@ static void free_pipe_context(struct pipes_struct *p)
 
 /****************************************************************************
  Accepts incoming data on an rpc pipe. Processes the data in pdu sized units.
+ Set pdu_ready if an entire PDU is ready for processing.
 ****************************************************************************/
 
-ssize_t process_incoming_data(struct pipes_struct *p, const char *data, size_t n)
+ssize_t process_incoming_data(struct pipes_struct *p, const char *data,
+                             size_t n, bool *pdu_ready)
 {
        size_t data_to_copy = MIN(n, RPC_MAX_PDU_FRAG_LEN
                                        - p->in_data.pdu.length);
+       *pdu_ready = false;
 
        DEBUG(10, ("process_incoming_data: Start: pdu.length = %u, "
                   "pdu_needed_len = %u, incoming data = %u\n",
@@ -215,8 +218,8 @@ ssize_t process_incoming_data(struct pipes_struct *p, const char *data, size_t n
         * (return the number of bytes handled in the call)
         */
 
-       if(p->in_data.pdu_needed_len == 0) {
-               process_complete_pdu(p);
+       if (p->in_data.pdu_needed_len == 0) {
+               *pdu_ready = true;
                return data_to_copy;
        }
 
@@ -238,11 +241,12 @@ static ssize_t write_to_internal_pipe(struct pipes_struct *p, const char *data,
 
        while(data_left) {
                ssize_t data_used;
+               bool pdu_ready = false;
 
                DEBUG(10, ("write_to_pipe: data_left = %u\n",
                          (unsigned int)data_left));
 
-               data_used = process_incoming_data(p, data, data_left);
+               data_used = process_incoming_data(p, data, data_left, &pdu_ready);
 
                DEBUG(10, ("write_to_pipe: data_used = %d\n",
                           (int)data_used));
@@ -253,6 +257,11 @@ static ssize_t write_to_internal_pipe(struct pipes_struct *p, const char *data,
 
                data_left -= data_used;
                data += data_used;
+
+               if (pdu_ready == true) {
+                       process_complete_pdu(p);
+                       break;
+               }
        }
 
        return n;
index 48511e466edd8be06acde65acfa9413ad5763e3b..8f20b52e4acd89f8d23dea144d975d6f396ca735 100644 (file)
@@ -45,6 +45,7 @@ struct tevent_req *np_read_send(TALLOC_CTX *mem_ctx, struct event_context *ev,
 NTSTATUS np_read_recv(struct tevent_req *req, ssize_t *nread,
                      bool *is_data_outstanding);
 
-ssize_t process_incoming_data(struct pipes_struct *p, const char *data, size_t n);
+ssize_t process_incoming_data(struct pipes_struct *p, const char *data,
+                             size_t n, bool *pdu_ready);
 
 #endif /* _RPC_SERVER_SRV_PIPE_HND_H_ */