From a66828a37fbb4250dd25c828f3bbb8535fcffea0 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Thu, 5 Feb 2009 11:15:06 +0100 Subject: Don't use recvall in the proxied np_read_send We don't know how much we will get. Resort to a single recv syscall --- source3/rpc_server/srv_pipe_hnd.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) (limited to 'source3/rpc_server') diff --git a/source3/rpc_server/srv_pipe_hnd.c b/source3/rpc_server/srv_pipe_hnd.c index 30d0cf408f..4cbe8d67a3 100644 --- a/source3/rpc_server/srv_pipe_hnd.c +++ b/source3/rpc_server/srv_pipe_hnd.c @@ -1255,10 +1255,9 @@ struct async_req *np_read_send(TALLOC_CTX *mem_ctx, struct event_context *ev, struct np_proxy_state *p = talloc_get_type_abort( handle->private_data, struct np_proxy_state); - state->nread = len; state->fd = p->fd; - subreq = recvall_send(state, ev, p->fd, data, len, 0); + subreq = async_recv(state, ev, p->fd, data, len, 0); if (subreq == NULL) { goto fail; } @@ -1283,14 +1282,21 @@ static void np_read_done(struct async_req *subreq) subreq->async.priv, struct async_req); struct np_read_state *state = talloc_get_type_abort( req->private_data, struct np_read_state); - NTSTATUS status; + ssize_t result; + int sys_errno; int available = 0; - status = recvall_recv(subreq); - if (!NT_STATUS_IS_OK(status)) { - async_req_nterror(req, status); + result = async_syscall_result_ssize_t(subreq, &sys_errno); + if (result == -1) { + async_req_nterror(req, map_nt_error_from_unix(sys_errno)); return; } + if (result == 0) { + async_req_nterror(req, NT_STATUS_END_OF_FILE); + return; + } + + state->nread = result; /* * We don't look at the ioctl result. We don't really care if there is -- cgit