From: Samuel Cabrero Date: Wed, 27 Feb 2019 19:21:44 +0000 (+0100) Subject: s3:rpc_server: Retrieve the dcesrv_endpoint from prefork listen data X-Git-Tag: ldb-2.2.0~1323 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7fef249d7a27684abfd09ac5f7b408a373346fe9;p=thirdparty%2Fsamba.git s3:rpc_server: Retrieve the dcesrv_endpoint from prefork listen data Signed-off-by: Samuel Cabrero Reviewed-by: Andrew Bartlett --- diff --git a/source3/printing/spoolssd.c b/source3/printing/spoolssd.c index 6ddbf4a220f..3bd7e55001c 100644 --- a/source3/printing/spoolssd.c +++ b/source3/printing/spoolssd.c @@ -44,7 +44,6 @@ #undef DBGC_CLASS #define DBGC_CLASS DBGC_RPC_SRV -#define SPOOLSS_PIPE_NAME "spoolss" #define DAEMON_NAME "spoolssd" static struct server_id parent_id; @@ -287,6 +286,7 @@ static bool spoolss_child_init(struct tevent_context *ev_ctx, struct spoolss_children_data { struct tevent_context *ev_ctx; struct messaging_context *msg_ctx; + struct dcesrv_context *dce_ctx; struct pf_worker_data *pf; int listen_fd_size; struct pf_listen_fd *listen_fds; @@ -305,6 +305,9 @@ static int spoolss_children_main(struct tevent_context *ev_ctx, struct spoolss_children_data *data; bool ok; int ret = 0; + struct dcesrv_context *dce_ctx = NULL; + + dce_ctx = talloc_get_type_abort(private_data, struct dcesrv_context); ok = spoolss_child_init(ev_ctx, child_id, pf); if (!ok) { @@ -318,6 +321,7 @@ static int spoolss_children_main(struct tevent_context *ev_ctx, data->pf = pf; data->ev_ctx = ev_ctx; data->msg_ctx = msg_ctx; + data->dce_ctx = dce_ctx; data->listen_fd_size = listen_fd_size; data->listen_fds = listen_fds; @@ -395,11 +399,13 @@ static void spoolss_handle_client(struct tevent_req *req) int sd; struct tsocket_address *srv_addr = NULL; struct tsocket_address *cli_addr = NULL; + void *listen_fd_data = NULL; + struct dcesrv_endpoint *ep = NULL; client = tevent_req_callback_data(req, struct spoolss_new_client); data = client->data; - ret = prefork_listen_recv(req, data, &sd, NULL, + ret = prefork_listen_recv(req, data, &sd, &listen_fd_data, &srv_addr, &cli_addr); /* this will free the request too */ @@ -410,6 +416,8 @@ static void spoolss_handle_client(struct tevent_req *req) return; } + ep = talloc_get_type_abort(listen_fd_data, struct dcesrv_endpoint); + /* Warn parent that our status changed */ messaging_send(data->msg_ctx, parent_id, MSG_PREFORK_CHILD_EVENT, &ping); @@ -419,8 +427,8 @@ static void spoolss_handle_client(struct tevent_req *req) dcerpc_ncacn_accept(data->ev_ctx, data->msg_ctx, - NCACN_NP, - SPOOLSS_PIPE_NAME, + data->dce_ctx, + ep, cli_addr, srv_addr, sd, @@ -776,7 +784,7 @@ pid_t start_spoolssd(struct tevent_context *ev_ctx, listen_fds_size, listen_fds, pf_spoolss_cfg.min_children, pf_spoolss_cfg.max_children, - &spoolss_children_main, NULL, + &spoolss_children_main, dce_ctx, &spoolss_pool); if (!ok) { exit(1); diff --git a/source3/rpc_server/lsasd.c b/source3/rpc_server/lsasd.c index 9d7be4a7a0c..676a22b12ac 100644 --- a/source3/rpc_server/lsasd.c +++ b/source3/rpc_server/lsasd.c @@ -277,6 +277,7 @@ static bool lsasd_child_init(struct tevent_context *ev_ctx, struct lsasd_children_data { struct tevent_context *ev_ctx; struct messaging_context *msg_ctx; + struct dcesrv_context *dce_ctx; struct pf_worker_data *pf; int listen_fd_size; struct pf_listen_fd *listen_fds; @@ -295,6 +296,9 @@ static int lsasd_children_main(struct tevent_context *ev_ctx, struct lsasd_children_data *data; bool ok; int ret = 0; + struct dcesrv_context *dce_ctx = NULL; + + dce_ctx = talloc_get_type_abort(private_data, struct dcesrv_context); ok = lsasd_child_init(ev_ctx, child_id, pf); if (!ok) { @@ -308,6 +312,7 @@ static int lsasd_children_main(struct tevent_context *ev_ctx, data->pf = pf; data->ev_ctx = ev_ctx; data->msg_ctx = msg_ctx; + data->dce_ctx = dce_ctx; data->listen_fd_size = listen_fd_size; data->listen_fds = listen_fds; @@ -388,6 +393,11 @@ static void lsasd_handle_client(struct tevent_req *req) TALLOC_CTX *tmp_ctx; struct tsocket_address *srv_addr; struct tsocket_address *cli_addr; + void *listen_fd_data = NULL; + struct dcesrv_endpoint *ep = NULL; + enum dcerpc_transport_t transport; + dcerpc_ncacn_termination_fn term_fn = NULL; + void *term_fn_data = NULL; client = tevent_req_callback_data(req, struct lsasd_new_client); data = client->data; @@ -401,7 +411,7 @@ static void lsasd_handle_client(struct tevent_req *req) rc = prefork_listen_recv(req, tmp_ctx, &sd, - NULL, + &listen_fd_data, &srv_addr, &cli_addr); @@ -413,69 +423,30 @@ static void lsasd_handle_client(struct tevent_req *req) goto done; } + ep = talloc_get_type_abort(listen_fd_data, struct dcesrv_endpoint); + transport = dcerpc_binding_get_transport(ep->ep_description); + if (transport == NCACN_NP) { + term_fn = lsasd_client_terminated; + term_fn_data = data; + } + /* Warn parent that our status changed */ messaging_send(data->msg_ctx, parent_id, MSG_PREFORK_CHILD_EVENT, &ping); - DEBUG(2, ("LSASD preforked child %d got client connection!\n", - (int)(data->pf->pid))); - - if (tsocket_address_is_inet(srv_addr, "ip")) { - DEBUG(3, ("Got a tcpip client connection from %s on interface %s\n", - tsocket_address_string(cli_addr, tmp_ctx), - tsocket_address_string(srv_addr, tmp_ctx))); - - dcerpc_ncacn_accept(data->ev_ctx, - data->msg_ctx, - NCACN_IP_TCP, - "IP", - cli_addr, - srv_addr, - sd, - lsasd_client_terminated, - data); - } else if (tsocket_address_is_unix(srv_addr)) { - const char *p; - const char *b; - - p = tsocket_address_unix_path(srv_addr, tmp_ctx); - if (p == NULL) { - talloc_free(tmp_ctx); - return; - } + DBG_INFO("LSASD preforked child %d got client connection on '%s'\n", + (int)(data->pf->pid), dcerpc_binding_string(tmp_ctx, + ep->ep_description)); - b = strrchr(p, '/'); - if (b != NULL) { - b++; - } else { - b = p; - } - - if (strstr(p, "/np/")) { - dcerpc_ncacn_accept(data->ev_ctx, - data->msg_ctx, - NCACN_NP, - b, - NULL, /* remote client address */ - NULL, /* local server address */ - sd, - lsasd_client_terminated, - data); - - } else { - dcerpc_ncacn_accept(data->ev_ctx, - data->msg_ctx, - NCALRPC, - b, - cli_addr, - srv_addr, - sd, - lsasd_client_terminated, - data); - } - } else { - DEBUG(0, ("ERROR: Unsupported socket!\n")); - } + dcerpc_ncacn_accept(data->ev_ctx, + data->msg_ctx, + data->dce_ctx, + ep, + cli_addr, + srv_addr, + sd, + term_fn, + term_fn_data); done: talloc_free(tmp_ctx); @@ -781,7 +752,7 @@ void start_lsasd(struct tevent_context *ev_ctx, pf_lsasd_cfg.min_children, pf_lsasd_cfg.max_children, &lsasd_children_main, - NULL, + dce_ctx, &lsasd_pool); if (!ok) { exit(1); diff --git a/source3/rpc_server/mdssd.c b/source3/rpc_server/mdssd.c index eafe7b99fea..0da768cafb4 100644 --- a/source3/rpc_server/mdssd.c +++ b/source3/rpc_server/mdssd.c @@ -225,6 +225,7 @@ static bool mdssd_child_init(struct tevent_context *ev_ctx, struct mdssd_children_data { struct tevent_context *ev_ctx; struct messaging_context *msg_ctx; + struct dcesrv_context *dce_ctx; struct pf_worker_data *pf; int listen_fd_size; struct pf_listen_fd *listen_fds; @@ -243,6 +244,9 @@ static int mdssd_children_main(struct tevent_context *ev_ctx, struct mdssd_children_data *data; bool ok; int ret = 0; + struct dcesrv_context *dce_ctx = NULL; + + dce_ctx = talloc_get_type_abort(private_data, struct dcesrv_context); ok = mdssd_child_init(ev_ctx, child_id, pf); if (!ok) { @@ -256,6 +260,7 @@ static int mdssd_children_main(struct tevent_context *ev_ctx, data->pf = pf; data->ev_ctx = ev_ctx; data->msg_ctx = msg_ctx; + data->dce_ctx = dce_ctx; data->listen_fd_size = listen_fd_size; data->listen_fds = listen_fds; @@ -336,6 +341,11 @@ static void mdssd_handle_client(struct tevent_req *req) TALLOC_CTX *tmp_ctx; struct tsocket_address *srv_addr; struct tsocket_address *cli_addr; + void *listen_fd_data = NULL; + struct dcesrv_endpoint *ep = NULL; + enum dcerpc_transport_t transport; + dcerpc_ncacn_termination_fn term_fn = NULL; + void *term_fn_data = NULL; client = tevent_req_callback_data(req, struct mdssd_new_client); data = client->data; @@ -349,7 +359,7 @@ static void mdssd_handle_client(struct tevent_req *req) rc = prefork_listen_recv(req, tmp_ctx, &sd, - NULL, + &listen_fd_data, &srv_addr, &cli_addr); @@ -361,68 +371,30 @@ static void mdssd_handle_client(struct tevent_req *req) goto done; } + ep = talloc_get_type_abort(listen_fd_data, struct dcesrv_endpoint); + transport = dcerpc_binding_get_transport(ep->ep_description); + if (transport == NCACN_NP) { + term_fn = mdssd_client_terminated; + term_fn_data = data; + } + /* Warn parent that our status changed */ messaging_send(data->msg_ctx, parent_id, MSG_PREFORK_CHILD_EVENT, &ping); - DEBUG(2, ("mdssd preforked child %d got client connection!\n", - (int)(data->pf->pid))); - - if (tsocket_address_is_inet(srv_addr, "ip")) { - DEBUG(3, ("Got a tcpip client connection from %s on inteface %s\n", - tsocket_address_string(cli_addr, tmp_ctx), - tsocket_address_string(srv_addr, tmp_ctx))); - - dcerpc_ncacn_accept(data->ev_ctx, - data->msg_ctx, - NCACN_IP_TCP, - "IP", - cli_addr, - srv_addr, - sd, - mdssd_client_terminated, - data); - } else if (tsocket_address_is_unix(srv_addr)) { - const char *p; - const char *b; - - p = tsocket_address_unix_path(srv_addr, tmp_ctx); - if (p == NULL) { - talloc_free(tmp_ctx); - return; - } - - b = strrchr(p, '/'); - if (b != NULL) { - b++; - } else { - b = p; - } + DBG_INFO("MDSSD preforked child %d got client connection on '%s'\n", + (int)(data->pf->pid), dcerpc_binding_string(tmp_ctx, + ep->ep_description)); - if (strstr(p, "/np/")) { - dcerpc_ncacn_accept(data->ev_ctx, - data->msg_ctx, - NCACN_NP, - b, - NULL, /* remote client address */ - NULL, /* local server address */ - sd, - mdssd_client_terminated, - data); - } else { - dcerpc_ncacn_accept(data->ev_ctx, - data->msg_ctx, - NCALRPC, - b, - cli_addr, - srv_addr, - sd, - mdssd_client_terminated, - data); - } - } else { - DEBUG(0, ("ERROR: Unsupported socket!\n")); - } + dcerpc_ncacn_accept(data->ev_ctx, + data->msg_ctx, + data->dce_ctx, + ep, + cli_addr, + srv_addr, + sd, + term_fn, + term_fn_data); done: talloc_free(tmp_ctx); @@ -695,7 +667,7 @@ void start_mdssd(struct tevent_context *ev_ctx, pf_mdssd_cfg.min_children, pf_mdssd_cfg.max_children, &mdssd_children_main, - NULL, + dce_ctx, &mdssd_pool); if (!ok) { exit(1); diff --git a/source3/rpc_server/rpc_server.c b/source3/rpc_server/rpc_server.c index 2204f35218c..c5c65407c40 100644 --- a/source3/rpc_server/rpc_server.c +++ b/source3/rpc_server/rpc_server.c @@ -291,8 +291,8 @@ static void dcesrv_ncacn_np_listener(struct tevent_context *ev, dcerpc_ncacn_accept(state->ev_ctx, state->msg_ctx, - NCACN_NP, - endpoint, + state->dce_ctx, + state->endpoint, NULL, /* remote client address */ NULL, /* local server address */ sd, @@ -498,8 +498,8 @@ static void dcesrv_ncacn_ip_tcp_listener(struct tevent_context *ev, dcerpc_ncacn_accept(state->ev_ctx, state->msg_ctx, - NCACN_IP_TCP, - "IP", + state->dce_ctx, + state->endpoint, cli_addr, srv_addr, s, @@ -719,8 +719,8 @@ static void dcesrv_ncalrpc_listener(struct tevent_context *ev, dcerpc_ncacn_accept(state->ev_ctx, state->msg_ctx, - NCALRPC, - endpoint, + state->dce_ctx, + state->endpoint, cli_addr, srv_addr, sd, state->termination_fn, state->termination_data); @@ -778,14 +778,19 @@ static void dcesrv_ncacn_accept_step2(struct dcerpc_ncacn_conn *ncacn_conn); void dcerpc_ncacn_accept(struct tevent_context *ev_ctx, struct messaging_context *msg_ctx, - enum dcerpc_transport_t transport, - const char *name, + struct dcesrv_context *dce_ctx, + struct dcesrv_endpoint *e, struct tsocket_address *cli_addr, struct tsocket_address *srv_addr, int s, dcerpc_ncacn_termination_fn termination_fn, void *termination_data) { + enum dcerpc_transport_t transport = + dcerpc_binding_get_transport(e->ep_description); + const char *endpoint = + dcerpc_binding_get_string_option(e->ep_description, + "endpoint"); struct dcerpc_ncacn_conn *ncacn_conn; NTSTATUS status; int rc; @@ -796,7 +801,7 @@ void dcerpc_ncacn_accept(struct tevent_context *ev_ctx, ev_ctx, msg_ctx, transport, - name, + endpoint, termination_fn, termination_data, &ncacn_conn); diff --git a/source3/rpc_server/rpc_server.h b/source3/rpc_server/rpc_server.h index 3a44b33e169..832b6bba423 100644 --- a/source3/rpc_server/rpc_server.h +++ b/source3/rpc_server/rpc_server.h @@ -106,8 +106,8 @@ NTSTATUS dcesrv_setup_ncalrpc_socket(struct tevent_context *ev_ctx, void dcerpc_ncacn_accept(struct tevent_context *ev_ctx, struct messaging_context *msg_ctx, - enum dcerpc_transport_t transport, - const char *name, + struct dcesrv_context *dce_ctx, + struct dcesrv_endpoint *e, struct tsocket_address *cli_addr, struct tsocket_address *srv_addr, int s,