From: Samuel Cabrero Date: Tue, 4 Jun 2019 14:45:07 +0000 (+0200) Subject: s3:rpc_server: Return NTSTATUS for dcesrv_setup_ncacn_ip_tcp_socket X-Git-Tag: talloc-2.3.0~44 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=ae14c51080c6b69edb0364b79a9cecde62e2684f;p=thirdparty%2Fsamba.git s3:rpc_server: Return NTSTATUS for dcesrv_setup_ncacn_ip_tcp_socket Signed-off-by: Samuel Cabrero Reviewed-by: Stefan Metzmacher --- diff --git a/source3/rpc_server/rpc_server.c b/source3/rpc_server/rpc_server.c index 4d4a30cc1dc..11c8b3ced29 100644 --- a/source3/rpc_server/rpc_server.c +++ b/source3/rpc_server/rpc_server.c @@ -652,10 +652,10 @@ NTSTATUS dcesrv_create_ncacn_ip_tcp_socket(const struct sockaddr_storage *ifss, return NT_STATUS_OK; } -uint16_t dcesrv_setup_ncacn_ip_tcp_socket(struct tevent_context *ev_ctx, +NTSTATUS dcesrv_setup_ncacn_ip_tcp_socket(struct tevent_context *ev_ctx, struct messaging_context *msg_ctx, const struct sockaddr_storage *ifss, - uint16_t port) + uint16_t *port) { struct dcerpc_ncacn_listen_state *state; struct tevent_fd *fde; @@ -665,11 +665,11 @@ uint16_t dcesrv_setup_ncacn_ip_tcp_socket(struct tevent_context *ev_ctx, state = talloc(ev_ctx, struct dcerpc_ncacn_listen_state); if (state == NULL) { DEBUG(0, ("setup_dcerpc_ncacn_tcpip_socket: Out of memory\n")); - return 0; + return NT_STATUS_NO_MEMORY; } state->fd = -1; - state->ep.port = port; + state->ep.port = *port; state->disconnect_fn = NULL; status = dcesrv_create_ncacn_ip_tcp_socket(ifss, &state->ep.port, @@ -690,6 +690,7 @@ uint16_t dcesrv_setup_ncacn_ip_tcp_socket(struct tevent_context *ev_ctx, rc = listen(state->fd, SMBD_LISTEN_BACKLOG); if (rc == -1) { + status = map_nt_error_from_unix_common(errno); DEBUG(0,("setup_tcpip_socket: listen - %s\n", strerror(errno))); goto out; } @@ -697,6 +698,7 @@ uint16_t dcesrv_setup_ncacn_ip_tcp_socket(struct tevent_context *ev_ctx, DEBUG(10, ("setup_tcpip_socket: opened socket fd %d for port %u\n", state->fd, state->ep.port)); + errno = 0; fde = tevent_add_fd(state->ev_ctx, state, state->fd, @@ -704,20 +706,27 @@ uint16_t dcesrv_setup_ncacn_ip_tcp_socket(struct tevent_context *ev_ctx, dcesrv_ncacn_ip_tcp_listener, state); if (fde == NULL) { + if (errno == 0) { + errno = ENOMEM; + } + status = map_nt_error_from_unix_common(errno); DEBUG(0, ("setup_tcpip_socket: Failed to add event handler!\n")); goto out; } tevent_fd_set_auto_close(fde); - return state->ep.port; + *port = state->ep.port; + + return NT_STATUS_OK; + out: if (state->fd != -1) { close(state->fd); } TALLOC_FREE(state); - return 0; + return status; } static void dcesrv_ncacn_ip_tcp_listener(struct tevent_context *ev, diff --git a/source3/rpc_server/rpc_server.h b/source3/rpc_server/rpc_server.h index 6a6c850f5df..5e9875fc976 100644 --- a/source3/rpc_server/rpc_server.h +++ b/source3/rpc_server/rpc_server.h @@ -93,10 +93,10 @@ void named_pipe_packet_process(struct tevent_req *subreq); NTSTATUS dcesrv_create_ncacn_ip_tcp_socket(const struct sockaddr_storage *ifss, uint16_t *port, int *out_fd); -uint16_t dcesrv_setup_ncacn_ip_tcp_socket(struct tevent_context *ev_ctx, +NTSTATUS dcesrv_setup_ncacn_ip_tcp_socket(struct tevent_context *ev_ctx, struct messaging_context *msg_ctx, const struct sockaddr_storage *ifss, - uint16_t port); + uint16_t *port); NTSTATUS dcesrv_create_ncalrpc_socket(const char *name, int *out_fd); bool setup_dcerpc_ncalrpc_socket(struct tevent_context *ev_ctx, diff --git a/source3/rpc_server/rpc_sock_helper.c b/source3/rpc_server/rpc_sock_helper.c index a778e530203..4ade35ec908 100644 --- a/source3/rpc_server/rpc_sock_helper.c +++ b/source3/rpc_server/rpc_sock_helper.c @@ -159,7 +159,7 @@ NTSTATUS dcesrv_setup_ncacn_ip_tcp_sockets(struct tevent_context *ev_ctx, { uint32_t num_ifs = iface_count(); uint32_t i; - uint16_t p = 0; + uint16_t p = port; TALLOC_CTX *tmp_ctx; NTSTATUS status = NT_STATUS_UNSUCCESSFUL; int rc; @@ -183,12 +183,11 @@ NTSTATUS dcesrv_setup_ncacn_ip_tcp_sockets(struct tevent_context *ev_ctx, struct tsocket_address *bind_addr; const char *addr; - p = dcesrv_setup_ncacn_ip_tcp_socket(ev_ctx, - msg_ctx, - ifss, - port); - if (p == 0) { - status = NT_STATUS_UNSUCCESSFUL; + status = dcesrv_setup_ncacn_ip_tcp_socket(ev_ctx, + msg_ctx, + ifss, + &p); + if (!NT_STATUS_IS_OK(status)) { goto done; } @@ -241,12 +240,11 @@ NTSTATUS dcesrv_setup_ncacn_ip_tcp_sockets(struct tevent_context *ev_ctx, continue; } - p = dcesrv_setup_ncacn_ip_tcp_socket(ev_ctx, - msg_ctx, - &ss, - port); - if (p == 0) { - status = NT_STATUS_UNSUCCESSFUL; + status = dcesrv_setup_ncacn_ip_tcp_socket(ev_ctx, + msg_ctx, + &ss, + &p); + if (!NT_STATUS_IS_OK(status)) { goto done; }