In preparation for making process_complete_pdu() asynchronous.
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;
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 */
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;
data_left -= data_used;
data += data_used;
+
+ if (pdu_ready == true) {
+ process_complete_pdu(ncacn_conn->p);
+ break;
+ }
}
/* Do not leak this buffer */
/****************************************************************************
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",
* (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;
}
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));
data_left -= data_used;
data += data_used;
+
+ if (pdu_ready == true) {
+ process_complete_pdu(p);
+ break;
+ }
}
return n;
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_ */