diff --git a/source3/rpc_server/rpc_server.c b/source3/rpc_server/rpc_server.c index 9a90157d9b5..58cf125775e 100644 --- a/source3/rpc_server/rpc_server.c +++ b/source3/rpc_server/rpc_server.c @@ -613,8 +613,9 @@ static void dcerpc_ncacn_tcpip_listener(struct tevent_context *ev, uint16_t flags, void *private_data); -int dcesrv_create_ncacn_ip_tcp_socket(const struct sockaddr_storage *ifss, - uint16_t *port) +NTSTATUS dcesrv_create_ncacn_ip_tcp_socket(const struct sockaddr_storage *ifss, + uint16_t *port, + int *out_fd) { int fd = -1; @@ -641,12 +642,14 @@ int dcesrv_create_ncacn_ip_tcp_socket(const struct sockaddr_storage *ifss, } if (fd == -1) { DEBUG(0, ("Failed to create socket on port %u!\n", *port)); - return -1; + return NT_STATUS_UNSUCCESSFUL; } DEBUG(10, ("Opened tcpip socket fd %d for port %u\n", fd, *port)); - return fd; + *out_fd = fd; + + return NT_STATUS_OK; } uint16_t setup_dcerpc_ncacn_tcpip_socket(struct tevent_context *ev_ctx, @@ -657,6 +660,7 @@ uint16_t setup_dcerpc_ncacn_tcpip_socket(struct tevent_context *ev_ctx, struct dcerpc_ncacn_listen_state *state; struct tevent_fd *fde; int rc; + NTSTATUS status; state = talloc(ev_ctx, struct dcerpc_ncacn_listen_state); if (state == NULL) { @@ -668,8 +672,9 @@ uint16_t setup_dcerpc_ncacn_tcpip_socket(struct tevent_context *ev_ctx, state->ep.port = port; state->disconnect_fn = NULL; - state->fd = dcesrv_create_ncacn_ip_tcp_socket(ifss, &state->ep.port); - if (state->fd == -1) { + status = dcesrv_create_ncacn_ip_tcp_socket(ifss, &state->ep.port, + &state->fd); + if (!NT_STATUS_IS_OK(status)) { goto out; } diff --git a/source3/rpc_server/rpc_server.h b/source3/rpc_server/rpc_server.h index 06750a14781..beb5709a7c0 100644 --- a/source3/rpc_server/rpc_server.h +++ b/source3/rpc_server/rpc_server.h @@ -90,8 +90,9 @@ void named_pipe_accept_function(struct tevent_context *ev_ctx, void *private_data); void named_pipe_packet_process(struct tevent_req *subreq); -int dcesrv_create_ncacn_ip_tcp_socket(const struct sockaddr_storage *ifss, - uint16_t *port); +NTSTATUS dcesrv_create_ncacn_ip_tcp_socket(const struct sockaddr_storage *ifss, + uint16_t *port, + int *out_fd); uint16_t setup_dcerpc_ncacn_tcpip_socket(struct tevent_context *ev_ctx, struct messaging_context *msg_ctx, const struct sockaddr_storage *ifss, diff --git a/source3/rpc_server/rpc_sock_helper.c b/source3/rpc_server/rpc_sock_helper.c index f093111b3c9..f4c95cd312e 100644 --- a/source3/rpc_server/rpc_sock_helper.c +++ b/source3/rpc_server/rpc_sock_helper.c @@ -60,9 +60,10 @@ NTSTATUS rpc_create_tcpip_sockets(const struct ndr_interface_table *iface, const char *addr; int fd; - fd = dcesrv_create_ncacn_ip_tcp_socket(ifss, &p); - if (fd < 0) { - status = NT_STATUS_UNSUCCESSFUL; + status = dcesrv_create_ncacn_ip_tcp_socket(ifss, + &p, + &fd); + if (!NT_STATUS_IS_OK(status)) { goto done; } listen_fd[*listen_fd_size] = fd; @@ -121,9 +122,10 @@ NTSTATUS rpc_create_tcpip_sockets(const struct ndr_interface_table *iface, continue; } - fd = dcesrv_create_ncacn_ip_tcp_socket(&ss, &p); - if (fd < 0) { - status = NT_STATUS_UNSUCCESSFUL; + status = dcesrv_create_ncacn_ip_tcp_socket(&ss, + &p, + &fd); + if (!NT_STATUS_IS_OK(status)) { goto done; } listen_fd[*listen_fd_size] = fd;