summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVolker Lendecke <vl@samba.org>2009-02-05 11:15:06 +0100
committerVolker Lendecke <vl@samba.org>2009-02-05 11:16:03 +0100
commita66828a37fbb4250dd25c828f3bbb8535fcffea0 (patch)
tree09168046a63a9fb4f5d0448836f86f19cf9a8499
parent83cf98f113541acca5a9b4d6ad084d401b64706f (diff)
downloadsamba-a66828a37fbb4250dd25c828f3bbb8535fcffea0.tar.gz
samba-a66828a37fbb4250dd25c828f3bbb8535fcffea0.tar.bz2
samba-a66828a37fbb4250dd25c828f3bbb8535fcffea0.zip
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
-rw-r--r--source3/rpc_server/srv_pipe_hnd.c18
1 files changed, 12 insertions, 6 deletions
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