diff options
Diffstat (limited to 'source4/librpc')
-rw-r--r-- | source4/librpc/rpc/dcerpc.c | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/source4/librpc/rpc/dcerpc.c b/source4/librpc/rpc/dcerpc.c index 7a568d3c9e..15c34f5dca 100644 --- a/source4/librpc/rpc/dcerpc.c +++ b/source4/librpc/rpc/dcerpc.c @@ -1058,6 +1058,7 @@ static void dcerpc_ship_next_request(struct dcerpc_connection *c) while (remaining > 0 || first_packet) { uint32_t chunk = MIN(chunk_size, remaining); bool last_frag = false; + bool do_trans = false; first_packet = false; pkt.pfc_flags &= ~(DCERPC_PFC_FLAG_FIRST |DCERPC_PFC_FLAG_LAST); @@ -1080,14 +1081,27 @@ static void dcerpc_ship_next_request(struct dcerpc_connection *c) DLIST_REMOVE(p->conn->pending, req); return; } - - req->status = p->conn->transport.send_request(p->conn, &blob, last_frag); + + if (last_frag && !req->async_call) { + do_trans = true; + } + + req->status = p->conn->transport.send_request(p->conn, &blob, do_trans); if (!NT_STATUS_IS_OK(req->status)) { req->state = RPC_REQUEST_DONE; DLIST_REMOVE(p->conn->pending, req); return; } + if (last_frag && !do_trans) { + req->status = p->conn->transport.send_read(p->conn); + if (!NT_STATUS_IS_OK(req->status)) { + req->state = RPC_REQUEST_DONE; + DLIST_REMOVE(p->conn->pending, req); + return; + } + } + remaining -= chunk; } } |