From: Volker Lendecke Date: Tue, 12 Jan 2021 16:36:44 +0000 (+0100) Subject: rpc_server: Use dcesrv_setup_ncacn_listener() in dcesrv_setup_endpoint_sockets() X-Git-Tag: samba-4.14.0rc1~40 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8004fb4a5bfa00d3199c11e8aadeb9691c0484e8;p=thirdparty%2Fsamba.git rpc_server: Use dcesrv_setup_ncacn_listener() in dcesrv_setup_endpoint_sockets() Signed-off-by: Volker Lendecke Reviewed-by: Samuel Cabrero --- diff --git a/source3/rpc_server/rpc_service_setup.c b/source3/rpc_server/rpc_service_setup.c index a05c6db1fb8..94cf0de2c00 100644 --- a/source3/rpc_server/rpc_service_setup.c +++ b/source3/rpc_server/rpc_service_setup.c @@ -251,44 +251,36 @@ NTSTATUS dcesrv_setup_endpoint_sockets(struct tevent_context *ev_ctx, dcerpc_ncacn_termination_fn term_fn, void *term_data) { + TALLOC_CTX *frame = talloc_stackframe(); enum dcerpc_transport_t transport = dcerpc_binding_get_transport(e->ep_description); char *binding = NULL; - NTSTATUS status; - - binding = dcerpc_binding_string(dce_ctx, e->ep_description); + NTSTATUS status = NT_STATUS_NO_MEMORY; + struct dcesrv_if_list *iface = NULL; + int fd = -1; + int *fds = &fd; + size_t i, num_fds = 1; + struct dcerpc_ncacn_listen_state **listen_states = NULL; + + binding = dcerpc_binding_string(frame, e->ep_description); if (binding == NULL) { - return NT_STATUS_NO_MEMORY; + goto fail; } DBG_DEBUG("Setting up endpoint '%s'\n", binding); switch (transport) { case NCALRPC: - status = dcesrv_setup_ncalrpc_socket(ev_ctx, - msg_ctx, - dce_ctx, - e, - term_fn, - term_data); + status = dcesrv_create_ncalrpc_socket(e, &fd); break; case NCACN_IP_TCP: - status = dcesrv_setup_ncacn_ip_tcp_sockets(ev_ctx, - msg_ctx, - dce_ctx, - e, - term_fn, - term_data); + status = dcesrv_create_ncacn_ip_tcp_sockets( + e, frame, &num_fds, &fds); break; case NCACN_NP: - status = dcesrv_setup_ncacn_np_socket(ev_ctx, - msg_ctx, - dce_ctx, - e, - term_fn, - term_data); + status = dcesrv_create_ncacn_np_socket(e, &fd); break; default: @@ -299,30 +291,83 @@ NTSTATUS dcesrv_setup_endpoint_sockets(struct tevent_context *ev_ctx, /* Build binding string again as the endpoint may have changed by * dcesrv_create__socket functions */ TALLOC_FREE(binding); - binding = dcerpc_binding_string(dce_ctx, e->ep_description); + binding = dcerpc_binding_string(frame, e->ep_description); if (binding == NULL) { - return NT_STATUS_NO_MEMORY; + status = NT_STATUS_NO_MEMORY; + goto fail; } if (!NT_STATUS_IS_OK(status)) { - struct dcesrv_if_list *iface = NULL; DBG_ERR("Failed to setup '%s' sockets for ", binding); for (iface = e->interface_list; iface; iface = iface->next) { DEBUGADD(DBGLVL_ERR, ("'%s' ", iface->iface->name)); } DEBUGADD(DBGLVL_ERR, (": %s\n", nt_errstr(status))); - return status; - } else { - struct dcesrv_if_list *iface = NULL; - DBG_INFO("Successfully listening on '%s' for ", binding); - for (iface = e->interface_list; iface; iface = iface->next) { - DEBUGADD(DBGLVL_INFO, ("'%s' ", iface->iface->name)); + goto fail; + } + + listen_states = talloc_array( + frame, struct dcerpc_ncacn_listen_state *, num_fds); + if (listen_states == NULL) { + status = NT_STATUS_NO_MEMORY; + goto fail; + } + + for (i=0; iinterface_list; iface; iface = iface->next) { + DEBUGADD(DBGLVL_INFO, ("'%s' ", iface->iface->name)); + } + DEBUGADD(DBGLVL_INFO, ("\n")); + + TALLOC_FREE(frame); + return NT_STATUS_OK; + +fail: + for (i=0; i