diff options
author | Stefan Metzmacher <metze@samba.org> | 2007-04-22 23:00:22 +0000 |
---|---|---|
committer | Gerald (Jerry) Carter <jerry@samba.org> | 2007-10-10 14:51:29 -0500 |
commit | 1912124dbfc501c5109f6ac36e125406078d408c (patch) | |
tree | a863846bd767627125f22abd26be74db66d81664 /source4/librpc/rpc/dcerpc_sock.c | |
parent | cc5ad07d84df94f8f2bc16fcb8015f1cf843c1e3 (diff) | |
download | samba-1912124dbfc501c5109f6ac36e125406078d408c.tar.gz samba-1912124dbfc501c5109f6ac36e125406078d408c.tar.xz samba-1912124dbfc501c5109f6ac36e125406078d408c.zip |
r22470: merge handling of broken connections from wins replication client code
to the rpc client code
we need to always ask for read events on the socket otherwise we never
get the connection error reported.
shutdown the transport when a request timeout.
metze
(This used to be commit 3403c0cb15e08ec838b0bc834f941051fb94d124)
Diffstat (limited to 'source4/librpc/rpc/dcerpc_sock.c')
-rw-r--r-- | source4/librpc/rpc/dcerpc_sock.c | 33 |
1 files changed, 27 insertions, 6 deletions
diff --git a/source4/librpc/rpc/dcerpc_sock.c b/source4/librpc/rpc/dcerpc_sock.c index ae7d00b669..fd54a20afc 100644 --- a/source4/librpc/rpc/dcerpc_sock.c +++ b/source4/librpc/rpc/dcerpc_sock.c @@ -48,12 +48,34 @@ static void sock_dead(struct dcerpc_connection *p, NTSTATUS status) { struct sock_private *sock = p->transport.private; - if (sock && sock->sock != NULL) { + if (!sock) return; + + if (sock->fde) { + talloc_free(sock->fde); + sock->fde = NULL; + } + + if (sock->sock) { talloc_free(sock->fde); + sock->fde = NULL; talloc_free(sock->sock); sock->sock = NULL; } + if (sock->packet) { + packet_recv_disable(sock->packet); + packet_set_fde(sock->packet, NULL); + packet_set_socket(sock->packet, NULL); + } + + if (NT_STATUS_EQUAL(NT_STATUS_UNSUCCESSFUL, status)) { + status = NT_STATUS_UNEXPECTED_NETWORK_ERROR; + } + + if (NT_STATUS_EQUAL(NT_STATUS_OK, status)) { + status = NT_STATUS_END_OF_FILE; + } + if (!NT_STATUS_IS_OK(status)) { p->transport.recv_data(p, NULL, status); } @@ -172,15 +194,15 @@ static NTSTATUS sock_send_request(struct dcerpc_connection *p, DATA_BLOB *data, /* shutdown sock pipe connection */ -static NTSTATUS sock_shutdown_pipe(struct dcerpc_connection *p) +static NTSTATUS sock_shutdown_pipe(struct dcerpc_connection *p, NTSTATUS status) { struct sock_private *sock = p->transport.private; if (sock && sock->sock) { - sock_dead(p, NT_STATUS_OK); + sock_dead(p, status); } - return NT_STATUS_OK; + return status; } /* @@ -253,7 +275,7 @@ static void continue_socket_connect(struct composite_context *ctx) sock->server_name = strupper_talloc(sock, s->target_hostname); sock->fde = event_add_fd(conn->event_ctx, sock->sock, socket_get_fd(sock->sock), - 0, sock_io_handler, conn); + EVENT_FD_READ, sock_io_handler, conn); conn->transport.private = sock; @@ -272,7 +294,6 @@ static void continue_socket_connect(struct composite_context *ctx) packet_set_event_context(sock->packet, conn->event_ctx); packet_set_fde(sock->packet, sock->fde); packet_set_serialise(sock->packet); - packet_recv_disable(sock->packet); packet_set_initial_read(sock->packet, 16); /* ensure we don't get SIGPIPE */ |