s3:rpc_server: Return NTSTATUS for dcesrv_create_ncacn_ip_tcp_socket
authorSamuel Cabrero <scabrero@suse.de>
Tue, 4 Jun 2019 14:16:36 +0000 (16:16 +0200)
committerStefan Metzmacher <metze@samba.org>
Mon, 22 Jul 2019 16:49:13 +0000 (16:49 +0000)
Additionally to the fd number, check the port number has been correctly
assigned. This check was performed by the callers of this function.

Signed-off-by: Samuel Cabrero <scabrero@suse.de>
Reviewed-by: Stefan Metzmacher <metze@samba.org>
source3/rpc_server/rpc_server.c
source3/rpc_server/rpc_server.h
source3/rpc_server/rpc_sock_helper.c

index 9a90157d9b5b66366c66a64118fb5093cca0925d..58cf125775e80f04d4f6ce442179bac3f94beada 100644 (file)
@@ -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;
        }
 
index 06750a14781339970a432273c8faa8fecc66fb9c..beb5709a7c020138a1c9fe4270e68860405a2d60 100644 (file)
@@ -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,
index f093111b3c9735d0fd5d732de74ab290db445fda..f4c95cd312e14197f0d1a10248f0de0764ed95f9 100644 (file)
@@ -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;