s3:rpc_server: Return NTSTATUS for dcesrv_setup_ncacn_ip_tcp_socket
authorSamuel Cabrero <scabrero@suse.de>
Tue, 4 Jun 2019 14:45:07 +0000 (16:45 +0200)
committerStefan Metzmacher <metze@samba.org>
Mon, 22 Jul 2019 16:49:13 +0000 (16:49 +0000)
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 4d4a30cc1dc3747c78ae4a264f2d808363cecae8..11c8b3ced295fb7790199e97c0e3417bd7e60f5b 100644 (file)
@@ -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,
index 6a6c850f5df46e0dd14c221bec915c31f14ccec6..5e9875fc97647540ac52cfb53e2401e39870d3de 100644 (file)
@@ -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,
index a778e530203e74e751df146f06069d6871afd7b4..4ade35ec908cde8b4cf015281ba7e96250ff4ccd 100644 (file)
@@ -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;
                        }