From: Samuel Cabrero Date: Wed, 27 Feb 2019 17:05:08 +0000 (+0100) Subject: s3:rpc_server: Create ncacn_ip_tcp sockets through enpoint init X-Git-Tag: ldb-2.2.0~1331 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a6b718b6ec3824c1c49eef92f3b5cf915494bce0;p=thirdparty%2Fsamba.git s3:rpc_server: Create ncacn_ip_tcp sockets through enpoint init Signed-off-by: Samuel Cabrero Reviewed-by: Andrew Bartlett --- diff --git a/source3/rpc_server/lsasd.c b/source3/rpc_server/lsasd.c index 0e69bbeb4d3..904dd11888e 100644 --- a/source3/rpc_server/lsasd.c +++ b/source3/rpc_server/lsasd.c @@ -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)) { diff --git a/source3/rpc_server/rpc_service_setup.c b/source3/rpc_server/rpc_service_setup.c index 311654bf4cd..00e34829ff0 100644 --- a/source3/rpc_server/rpc_service_setup.c +++ b/source3/rpc_server/rpc_service_setup.c @@ -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: diff --git a/source3/rpc_server/rpc_sock_helper.c b/source3/rpc_server/rpc_sock_helper.c index 5ca154bf5ad..17d0b6bb451 100644 --- a/source3/rpc_server/rpc_sock_helper.c +++ b/source3/rpc_server/rpc_sock_helper.c @@ -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" @@ -32,26 +32,33 @@ #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); diff --git a/source3/rpc_server/rpc_sock_helper.h b/source3/rpc_server/rpc_sock_helper.h index 1bf1be4c0e4..4577e920a1e 100644 --- a/source3/rpc_server/rpc_sock_helper.h +++ b/source3/rpc_server/rpc_sock_helper.h @@ -27,12 +27,10 @@ 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,