diff options
Diffstat (limited to 'source4/librpc')
-rw-r--r-- | source4/librpc/rpc/dcerpc_sock.c | 32 |
1 files changed, 20 insertions, 12 deletions
diff --git a/source4/librpc/rpc/dcerpc_sock.c b/source4/librpc/rpc/dcerpc_sock.c index eb2e7f8f66..2ecf9f1530 100644 --- a/source4/librpc/rpc/dcerpc_sock.c +++ b/source4/librpc/rpc/dcerpc_sock.c @@ -35,6 +35,7 @@ struct sock_private { char *server_name; struct packet_context *packet; + uint32_t pending_reads; }; @@ -83,22 +84,17 @@ static NTSTATUS sock_complete_packet(void *private, DATA_BLOB blob, size_t *size } /* - process send requests -*/ -static void sock_process_send(struct dcerpc_connection *p) -{ - struct sock_private *sock = p->transport.private; - packet_queue_run(sock->packet); -} - - -/* process recv requests */ static NTSTATUS sock_process_recv(void *private, DATA_BLOB blob) { struct dcerpc_connection *p = talloc_get_type(private, struct dcerpc_connection); + struct sock_private *sock = p->transport.private; + sock->pending_reads--; + if (sock->pending_reads == 0) { + packet_recv_disable(sock->packet); + } p->transport.recv_data(p, &blob, NT_STATUS_OK); return NT_STATUS_OK; } @@ -114,7 +110,7 @@ static void sock_io_handler(struct event_context *ev, struct fd_event *fde, struct sock_private *sock = p->transport.private; if (flags & EVENT_FD_WRITE) { - sock_process_send(p); + packet_queue_run(sock->packet); return; } @@ -132,6 +128,11 @@ static void sock_io_handler(struct event_context *ev, struct fd_event *fde, */ static NTSTATUS sock_send_read(struct dcerpc_connection *p) { + struct sock_private *sock = p->transport.private; + sock->pending_reads++; + if (sock->pending_reads == 1) { + packet_recv_enable(sock->packet); + } return NT_STATUS_OK; } @@ -159,6 +160,10 @@ static NTSTATUS sock_send_request(struct dcerpc_connection *p, DATA_BLOB *data, return status; } + if (trigger_read) { + sock_send_read(p); + } + return NT_STATUS_OK; } @@ -230,10 +235,11 @@ static NTSTATUS dcerpc_pipe_open_socket(struct dcerpc_connection *c, c->transport.peer_name = sock_peer_name; sock->sock = socket_ctx; + sock->pending_reads = 0; sock->server_name = strupper_talloc(sock, server); sock->fde = event_add_fd(c->event_ctx, sock->sock, socket_get_fd(sock->sock), - EVENT_FD_READ, sock_io_handler, c); + 0, sock_io_handler, c); c->transport.private = sock; @@ -249,6 +255,8 @@ static NTSTATUS dcerpc_pipe_open_socket(struct dcerpc_connection *c, packet_set_error_handler(sock->packet, sock_error_handler); packet_set_event_context(sock->packet, c->event_ctx); packet_set_serialise(sock->packet, sock->fde); + packet_recv_disable(sock->packet); + packet_set_initial_read(sock->packet, 16); /* ensure we don't get SIGPIPE */ BlockSignals(True,SIGPIPE); |