From: Volker Lendecke Date: Fri, 29 Jan 2021 17:16:08 +0000 (+0100) Subject: librpc: Add "private_data" to struct dcesrv_context_callbacks X-Git-Tag: tevent-0.11.0~1544 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=403eabe4fc3d43d80f3b33f104a8e35296b60fef;p=thirdparty%2Fsamba.git librpc: Add "private_data" to struct dcesrv_context_callbacks Not used right now, but we should never have callbacks without a "private_data" pointer. Some of the callbacks could even today benefit from this. Signed-off-by: Volker Lendecke Reviewed-by: Jeremy Allison --- diff --git a/librpc/rpc/dcesrv_auth.c b/librpc/rpc/dcesrv_auth.c index 8ac90f2a2bd..1f09bf0d18e 100644 --- a/librpc/rpc/dcesrv_auth.c +++ b/librpc/rpc/dcesrv_auth.c @@ -79,6 +79,7 @@ static bool dcesrv_auth_prepare_gensec(struct dcesrv_call_state *call) { struct dcesrv_connection *dce_conn = call->conn; struct dcesrv_auth *auth = call->auth_state; + struct dcesrv_context_callbacks *cb = &call->conn->dce_ctx->callbacks; NTSTATUS status; if (auth->auth_started) { @@ -127,9 +128,11 @@ static bool dcesrv_auth_prepare_gensec(struct dcesrv_call_state *call) auth->auth_level = call->in_auth_info.auth_level; auth->auth_context_id = call->in_auth_info.auth_context_id; - status = call->conn->dce_ctx->callbacks.auth.gensec_prepare(auth, - call, - &auth->gensec_security); + status = cb->auth.gensec_prepare( + auth, + call, + &auth->gensec_security, + cb->auth.private_data); if (!NT_STATUS_IS_OK(status)) { DEBUG(1, ("Failed to call samba_server_gensec_start %s\n", nt_errstr(status))); @@ -246,6 +249,7 @@ void dcesrv_default_auth_state_prepare_request(struct dcesrv_call_state *call) { struct dcesrv_connection *dce_conn = call->conn; struct dcesrv_auth *auth = call->auth_state; + struct dcesrv_context_callbacks *cb = &call->conn->dce_ctx->callbacks; if (auth->auth_audited) { return; @@ -267,11 +271,11 @@ void dcesrv_default_auth_state_prepare_request(struct dcesrv_call_state *call) return; } - if (!call->conn->dce_ctx->callbacks.log.successful_authz) { + if (cb->log.successful_authz == NULL) { return; } - call->conn->dce_ctx->callbacks.log.successful_authz(call); + cb->log.successful_authz(call, cb->log.private_data); } /* @@ -283,6 +287,7 @@ bool dcesrv_auth_bind(struct dcesrv_call_state *call) { struct ncacn_packet *pkt = &call->pkt; struct dcesrv_auth *auth = call->auth_state; + struct dcesrv_context_callbacks *cb = &call->conn->dce_ctx->callbacks; NTSTATUS status; if (pkt->auth_length == 0) { @@ -291,8 +296,8 @@ bool dcesrv_auth_bind(struct dcesrv_call_state *call) auth->auth_context_id = 0; auth->auth_started = true; - if (call->conn->dce_ctx->callbacks.log.successful_authz) { - call->conn->dce_ctx->callbacks.log.successful_authz(call); + if (cb->log.successful_authz != NULL) { + cb->log.successful_authz(call, cb->log.private_data); } return true; diff --git a/librpc/rpc/dcesrv_core.c b/librpc/rpc/dcesrv_core.c index 7a20ffe71a0..a5bfac507f5 100644 --- a/librpc/rpc/dcesrv_core.c +++ b/librpc/rpc/dcesrv_core.c @@ -952,7 +952,8 @@ static NTSTATUS dcesrv_bind(struct dcesrv_call_state *call) conn->max_recv_frag = max_rep; conn->max_xmit_frag = max_rep; - status = dce_ctx->callbacks.assoc_group.find(call); + status = dce_ctx->callbacks.assoc_group.find( + call, dce_ctx->callbacks.assoc_group.private_data); if (!NT_STATUS_IS_OK(status)) { DBG_NOTICE("Failed to find assoc_group 0x%08x: %s\n", call->pkt.u.bind.assoc_group_id, nt_errstr(status)); diff --git a/librpc/rpc/dcesrv_core.h b/librpc/rpc/dcesrv_core.h index 6371552a56d..d566aa53217 100644 --- a/librpc/rpc/dcesrv_core.h +++ b/librpc/rpc/dcesrv_core.h @@ -381,15 +381,22 @@ struct dcesrv_assoc_group { struct dcesrv_context_callbacks { struct { - void (*successful_authz)(struct dcesrv_call_state *); + void (*successful_authz)( + struct dcesrv_call_state *call, void *private_data); + void *private_data; } log; struct { - NTSTATUS (*gensec_prepare)(TALLOC_CTX *mem_ctx, - struct dcesrv_call_state *call, - struct gensec_security **out); + NTSTATUS (*gensec_prepare)( + TALLOC_CTX *mem_ctx, + struct dcesrv_call_state *call, + struct gensec_security **out, + void *private_data); + void *private_data; } auth; struct { - NTSTATUS (*find)(struct dcesrv_call_state *); + NTSTATUS (*find)( + struct dcesrv_call_state *call, void *private_data); + void *private_data; } assoc_group; }; diff --git a/source3/rpc_server/rpc_ncacn_np.c b/source3/rpc_server/rpc_ncacn_np.c index 569304b3467..30f2d88d4bf 100644 --- a/source3/rpc_server/rpc_ncacn_np.c +++ b/source3/rpc_server/rpc_ncacn_np.c @@ -488,7 +488,9 @@ static struct tevent_req *rpcint_bh_raw_call_send(TALLOC_CTX *mem_ctx, if (hs->conn->assoc_group == NULL) { ZERO_STRUCT(state->call->pkt); state->call->pkt.u.bind.assoc_group_id = 0; - status = dce_ctx->callbacks.assoc_group.find(state->call); + status = dce_ctx->callbacks.assoc_group.find( + state->call, + dce_ctx->callbacks.assoc_group.private_data); if (tevent_req_nterror(req, status)) { return tevent_req_post(req, ev); } diff --git a/source3/rpc_server/rpc_server.c b/source3/rpc_server/rpc_server.c index badb63ad84b..adf2ba70628 100644 --- a/source3/rpc_server/rpc_server.c +++ b/source3/rpc_server/rpc_server.c @@ -533,9 +533,11 @@ static void dcesrv_ncacn_accept_step2(struct dcerpc_ncacn_conn *ncacn_conn) return; } -NTSTATUS dcesrv_auth_gensec_prepare(TALLOC_CTX *mem_ctx, - struct dcesrv_call_state *call, - struct gensec_security **out) +NTSTATUS dcesrv_auth_gensec_prepare( + TALLOC_CTX *mem_ctx, + struct dcesrv_call_state *call, + struct gensec_security **out, + void *private_data) { struct gensec_security *gensec = NULL; NTSTATUS status; @@ -559,7 +561,9 @@ NTSTATUS dcesrv_auth_gensec_prepare(TALLOC_CTX *mem_ctx, return NT_STATUS_OK; } -void dcesrv_log_successful_authz(struct dcesrv_call_state *call) +void dcesrv_log_successful_authz( + struct dcesrv_call_state *call, + void *private_data) { TALLOC_CTX *frame = talloc_stackframe(); struct auth4_context *auth4_context = NULL; @@ -631,7 +635,9 @@ static NTSTATUS dcesrv_assoc_group_new(struct dcesrv_call_state *call, return NT_STATUS_OK; } -NTSTATUS dcesrv_assoc_group_find(struct dcesrv_call_state *call) +NTSTATUS dcesrv_assoc_group_find( + struct dcesrv_call_state *call, + void *private_data) { uint32_t assoc_group_id = call->pkt.u.bind.assoc_group_id; diff --git a/source3/rpc_server/rpc_server.h b/source3/rpc_server/rpc_server.h index f735c394e83..17748094919 100644 --- a/source3/rpc_server/rpc_server.h +++ b/source3/rpc_server/rpc_server.h @@ -90,11 +90,17 @@ void dcerpc_ncacn_accept(struct tevent_context *ev_ctx, dcerpc_ncacn_termination_fn termination_fn, void *termination_data); -NTSTATUS dcesrv_auth_gensec_prepare(TALLOC_CTX *mem_ctx, - struct dcesrv_call_state *call, - struct gensec_security **out); -void dcesrv_log_successful_authz(struct dcesrv_call_state *call); -NTSTATUS dcesrv_assoc_group_find(struct dcesrv_call_state *call); +NTSTATUS dcesrv_auth_gensec_prepare( + TALLOC_CTX *mem_ctx, + struct dcesrv_call_state *call, + struct gensec_security **out, + void *private_data); +void dcesrv_log_successful_authz( + struct dcesrv_call_state *call, + void *private_data); +NTSTATUS dcesrv_assoc_group_find( + struct dcesrv_call_state *call, + void *private_data); NTSTATUS dcesrv_endpoint_by_ncacn_np_name(struct dcesrv_context *dce_ctx, const char *endpoint, diff --git a/source3/winbindd/winbindd_dual_ndr.c b/source3/winbindd/winbindd_dual_ndr.c index 0cc86faeab6..39c3a146c03 100644 --- a/source3/winbindd/winbindd_dual_ndr.c +++ b/source3/winbindd/winbindd_dual_ndr.c @@ -481,6 +481,7 @@ enum winbindd_result winbindd_dual_ndrcmd(struct winbindd_domain *domain, struct dcesrv_connection *dcesrv_conn = NULL; struct dcesrv_call_state *dcesrv_call = NULL; struct data_blob_list_item *rep = NULL; + struct dcesrv_context_callbacks *cb = NULL; uint32_t opnum = state->request->data.ndrcmd; TALLOC_CTX *mem_ctx; NTSTATUS status; @@ -522,8 +523,10 @@ enum winbindd_result winbindd_dual_ndrcmd(struct winbindd_domain *domain, ZERO_STRUCT(dcesrv_call->pkt); dcesrv_call->pkt.u.bind.assoc_group_id = 0; - status = dcesrv_call->conn->dce_ctx->callbacks.assoc_group.find( - dcesrv_call); + + cb = &dcesrv_call->conn->dce_ctx->callbacks; + status = cb->assoc_group.find( + dcesrv_call, cb->assoc_group.private_data); if (!NT_STATUS_IS_OK(status)) { goto out; } diff --git a/source4/rpc_server/dcerpc_server.c b/source4/rpc_server/dcerpc_server.c index 94f7146517a..2b63305cde2 100644 --- a/source4/rpc_server/dcerpc_server.c +++ b/source4/rpc_server/dcerpc_server.c @@ -115,7 +115,9 @@ static struct dcesrv_assoc_group *dcesrv_assoc_group_new(struct dcesrv_connectio return assoc_group; } -NTSTATUS dcesrv_assoc_group_find(struct dcesrv_call_state *call) +NTSTATUS dcesrv_assoc_group_find( + struct dcesrv_call_state *call, + void *private_data) { /* if provided, check the assoc_group is valid @@ -635,7 +637,9 @@ _PUBLIC_ struct server_id dcesrv_server_id(struct dcesrv_connection *conn) return srv_conn->server_id; } -void log_successful_dcesrv_authz_event(struct dcesrv_call_state *call) +void log_successful_dcesrv_authz_event( + struct dcesrv_call_state *call, + void *private_data) { struct dcesrv_auth *auth = call->auth_state; enum dcerpc_transport_t transport = @@ -666,9 +670,11 @@ void log_successful_dcesrv_authz_event(struct dcesrv_call_state *call) auth->auth_audited = true; } -NTSTATUS dcesrv_gensec_prepare(TALLOC_CTX *mem_ctx, - struct dcesrv_call_state *call, - struct gensec_security **out) +NTSTATUS dcesrv_gensec_prepare( + TALLOC_CTX *mem_ctx, + struct dcesrv_call_state *call, + struct gensec_security **out, + void *private_data) { struct cli_credentials *server_creds = NULL; struct imessaging_context *imsg_ctx =