s3:rpc_server: Create ncacn_ip_tcp sockets through enpoint init
authorSamuel Cabrero <scabrero@suse.de>
Wed, 27 Feb 2019 17:05:08 +0000 (18:05 +0100)
committerSamuel Cabrero <scabrero@sn-devel-184>
Fri, 20 Mar 2020 15:36:34 +0000 (15:36 +0000)
Signed-off-by: Samuel Cabrero <scabrero@samba.org>
Reviewed-by: Andrew Bartlett <abartlet@samba.org>
source3/rpc_server/lsasd.c
source3/rpc_server/rpc_service_setup.c
source3/rpc_server/rpc_sock_helper.c
source3/rpc_server/rpc_sock_helper.h

index 0e69bbeb4d3cb2fe1376f6d89fa41eeac10cd87d..904dd11888e1d0d268baa13aa36a08ca410aa19f 100644 (file)
@@ -631,26 +631,6 @@ static NTSTATUS lsasd_create_sockets(struct tevent_context *ev_ctx,
                }
        }
 
-       /* Create only one tcpip listener for all services */
-       status = dcesrv_create_ncacn_ip_tcp_sockets(&ndr_table_lsarpc,
-                                                   v_orig,
-                                                   0,
-                                                   listen_fd,
-                                                   listen_fd_size);
-       if (!NT_STATUS_IS_OK(status)) {
-               goto done;
-       }
-
-       /* Start to listen on tcpip sockets */
-       for (i = 0; i < *listen_fd_size; i++) {
-               rc = listen(listen_fd[i].fd, pf_lsasd_cfg.max_allowed_clients);
-               if (rc == -1) {
-                       DEBUG(0, ("Failed to listen on tcpip socket - %s\n",
-                                 strerror(errno)));
-                       goto done;
-               }
-       }
-
        /* LSARPC */
        status = dcesrv_create_ncacn_np_socket("lsarpc", &fd);
        if (!NT_STATUS_IS_OK(status)) {
index 311654bf4cd55ce52c7ceb1f1fe570d2443bd193..00e34829ff03ccb00d8c0a181122f6302ae2b5d5 100644 (file)
@@ -142,8 +142,10 @@ NTSTATUS dcesrv_create_endpoint_sockets(struct tevent_context *ev_ctx,
                break;
 
        case NCACN_IP_TCP:
-               /* TODO */
-               status = NT_STATUS_OK;
+               status = dcesrv_create_ncacn_ip_tcp_sockets(e,
+                                                           bvec,
+                                                           listen_fds,
+                                                           listen_fds_size);
                break;
 
        case NCACN_NP:
index 5ca154bf5adcda51fa57e68e3a99c7e841aab45f..17d0b6bb451a18e474c900d6e0558514ecf63889 100644 (file)
@@ -24,7 +24,7 @@
 
 #include "../lib/tsocket/tsocket.h"
 #include "librpc/rpc/dcerpc_ep.h"
-#include "rpc_server/rpc_server.h"
+#include "librpc/rpc/dcesrv_core.h"
 #include "rpc_server/rpc_sock_helper.h"
 #include "lib/server_prefork.h"
 #include "librpc/ndr/ndr_table.h"
 #undef DBGC_CLASS
 #define DBGC_CLASS DBGC_RPC_SRV
 
-NTSTATUS dcesrv_create_ncacn_ip_tcp_sockets(
-                               const struct ndr_interface_table *iface,
-                               struct dcerpc_binding_vector *bvec,
-                               uint16_t port,
-                               struct pf_listen_fd *listen_fd,
-                               int *listen_fd_size)
+NTSTATUS dcesrv_create_ncacn_ip_tcp_sockets(struct dcesrv_endpoint *e,
+                                           struct dcerpc_binding_vector *bvec,
+                                           struct pf_listen_fd *listen_fd,
+                                           int *listen_fd_size)
 {
-       uint32_t num_ifs = iface_count();
-       uint32_t i;
-       uint16_t p = port;
        TALLOC_CTX *tmp_ctx;
        NTSTATUS status = NT_STATUS_UNSUCCESSFUL;
        int rc;
+       uint16_t port = 0;
+       char port_str[6];
+       const char *endpoint = NULL;
 
        tmp_ctx = talloc_stackframe();
        if (tmp_ctx == NULL) {
                return NT_STATUS_NO_MEMORY;
        }
 
+       endpoint = dcerpc_binding_get_string_option(e->ep_description,
+                                                   "endpoint");
+       if (endpoint != NULL) {
+               port = atoi(endpoint);
+       }
+
        if (lp_interfaces() && lp_bind_interfaces_only()) {
+               uint32_t num_ifs = iface_count();
+               uint32_t i;
+
                /*
                 * We have been given an interfaces line, and been told to only
                 * bind to those interfaces. Create a socket per interface and
@@ -64,19 +71,21 @@ NTSTATUS dcesrv_create_ncacn_ip_tcp_sockets(
                                        iface_n_sockaddr_storage(i);
                        struct tsocket_address *bind_addr;
                        const char *addr;
-                       int fd;
+                       int fd = -1;
 
                        status = dcesrv_create_ncacn_ip_tcp_socket(ifss,
-                                                                  &p,
+                                                                  &port,
                                                                   &fd);
                        if (!NT_STATUS_IS_OK(status)) {
                                goto done;
                        }
                        listen_fd[*listen_fd_size].fd = fd;
-                       listen_fd[*listen_fd_size].fd_data = NULL;
+                       listen_fd[*listen_fd_size].fd_data = e;
                        (*listen_fd_size)++;
 
                        if (bvec != NULL) {
+                               struct dcesrv_if_list *if_list = NULL;
+
                                rc = tsocket_address_bsd_from_sockaddr(tmp_ctx,
                                                                       (const struct sockaddr *)ifss,
                                                                       sizeof(struct sockaddr_storage),
@@ -95,13 +104,19 @@ NTSTATUS dcesrv_create_ncacn_ip_tcp_sockets(
                                        goto done;
                                }
 
-                               status = dcerpc_binding_vector_add_port(iface,
-                                                                       bvec,
-                                                                       addr,
-                                                                       p);
-                               if (!NT_STATUS_IS_OK(status)) {
-                                       close(fd);
-                                       goto done;
+                               for (if_list = e->interface_list; if_list; if_list = if_list->next) {
+                                       const struct ndr_interface_table *iface = NULL;
+                                       iface = ndr_table_by_syntax(&if_list->iface->syntax_id);
+                                       if (iface != NULL) {
+                                               status = dcerpc_binding_vector_add_port(iface,
+                                                                                       bvec,
+                                                                                       addr,
+                                                                                       port);
+                                               if (!NT_STATUS_IS_OK(status)) {
+                                                       close(fd);
+                                                       goto done;
+                                               }
+                                       }
                                }
                        }
                }
@@ -120,7 +135,7 @@ NTSTATUS dcesrv_create_ncacn_ip_tcp_sockets(
                     next_token_talloc(talloc_tos(), &sock_ptr, &sock_tok, " \t,");
                    ) {
                        struct sockaddr_storage ss;
-                       int fd;
+                       int fd = -1;
 
                        /* open an incoming socket */
                        if (!interpret_string_addr(&ss,
@@ -130,28 +145,47 @@ NTSTATUS dcesrv_create_ncacn_ip_tcp_sockets(
                        }
 
                        status = dcesrv_create_ncacn_ip_tcp_socket(&ss,
-                                                                  &p,
+                                                                  &port,
                                                                   &fd);
                        if (!NT_STATUS_IS_OK(status)) {
                                goto done;
                        }
                        listen_fd[*listen_fd_size].fd = fd;
-                       listen_fd[*listen_fd_size].fd_data = NULL;
+                       listen_fd[*listen_fd_size].fd_data = e;
                        (*listen_fd_size)++;
 
                        if (bvec != NULL) {
-                               status = dcerpc_binding_vector_add_port(iface,
-                                                                       bvec,
-                                                                       sock_tok,
-                                                                       p);
-                               if (!NT_STATUS_IS_OK(status)) {
-                                       close(fd);
-                                       goto done;
+                               struct dcesrv_if_list *if_list = NULL;
+
+                               for (if_list = e->interface_list; if_list; if_list = if_list->next) {
+                                       const struct ndr_interface_table *iface = NULL;
+                                       iface = ndr_table_by_syntax(&if_list->iface->syntax_id);
+                                       if (iface != NULL) {
+                                               status = dcerpc_binding_vector_add_port(iface,
+                                                                                       bvec,
+                                                                                       sock_tok,
+                                                                                       port);
+                                               if (!NT_STATUS_IS_OK(status)) {
+                                                       close(fd);
+                                                       goto done;
+                                               }
+                                       }
                                }
                        }
                }
        }
 
+       /* Set the port in the endpoint */
+       snprintf(port_str, sizeof(port_str), "%u", port);
+
+       status = dcerpc_binding_set_string_option(e->ep_description,
+                                                 "endpoint", port_str);
+       if (!NT_STATUS_IS_OK(status)) {
+               DBG_ERR("Failed to set binding endpoint '%s': %s\n",
+                       port_str, nt_errstr(status));
+               goto done;
+       }
+
        status = NT_STATUS_OK;
 done:
        talloc_free(tmp_ctx);
index 1bf1be4c0e4b1855802ba9b3270482557c5bd5ad..4577e920a1ed6dd568287a48a6f0e84934c12dd0 100644 (file)
 
 struct pf_listen_fd;
 
-NTSTATUS dcesrv_create_ncacn_ip_tcp_sockets(
-                               const struct ndr_interface_table *iface,
-                               struct dcerpc_binding_vector *bvec,
-                               uint16_t port,
-                               struct pf_listen_fd *listen_fd,
-                               int *listen_fd_size);
+NTSTATUS dcesrv_create_ncacn_ip_tcp_sockets(struct dcesrv_endpoint *e,
+                                           struct dcerpc_binding_vector *bvec,
+                                           struct pf_listen_fd *listen_fd,
+                                           int *listen_fd_size);
 
 NTSTATUS dcesrv_setup_ncacn_ip_tcp_sockets(struct tevent_context *ev_ctx,
                                           struct messaging_context *msg_ctx,