132 lines
5.0 KiB
Diff
132 lines
5.0 KiB
Diff
|
From ae6898e7dc60d7067f0d71212c7ed28fc9e8e285 Mon Sep 17 00:00:00 2001
|
||
|
From: =?UTF-8?q?Pavel=20B=C5=99ezina?= <pbrezina@redhat.com>
|
||
|
Date: Fri, 16 Oct 2020 15:36:51 +0200
|
||
|
Subject: [PATCH 13/19] kcm: add per-connection data to be shared between
|
||
|
requests
|
||
|
|
||
|
Resolves: https://github.com/SSSD/sssd/issues/5349
|
||
|
---
|
||
|
src/responder/kcm/kcmsrv_cmd.c | 21 +++++++++++++++++----
|
||
|
src/responder/kcm/kcmsrv_ops.c | 3 +++
|
||
|
src/responder/kcm/kcmsrv_ops.h | 5 +++++
|
||
|
3 files changed, 25 insertions(+), 4 deletions(-)
|
||
|
|
||
|
diff --git a/src/responder/kcm/kcmsrv_cmd.c b/src/responder/kcm/kcmsrv_cmd.c
|
||
|
index 99980050f205730169f5907db4018e4fe57b046d..a1aa9aa20f7c2b5cd972bd944995286de5e7c1e2 100644
|
||
|
--- a/src/responder/kcm/kcmsrv_cmd.c
|
||
|
+++ b/src/responder/kcm/kcmsrv_cmd.c
|
||
|
@@ -373,13 +373,16 @@ static errno_t kcm_cmd_dispatch(struct kcm_ctx *kctx,
|
||
|
{
|
||
|
struct tevent_req *req;
|
||
|
struct cli_ctx *cctx;
|
||
|
+ struct kcm_conn_data *conn_data;
|
||
|
|
||
|
cctx = req_ctx->cctx;
|
||
|
+ conn_data = talloc_get_type(cctx->state_ctx, struct kcm_conn_data);
|
||
|
|
||
|
req = kcm_cmd_send(req_ctx,
|
||
|
cctx->ev,
|
||
|
kctx->qctx,
|
||
|
req_ctx->kctx->kcm_data,
|
||
|
+ conn_data,
|
||
|
req_ctx->cctx->creds,
|
||
|
&req_ctx->op_io.request,
|
||
|
req_ctx->op_io.op);
|
||
|
@@ -492,7 +495,7 @@ static void kcm_recv(struct cli_ctx *cctx)
|
||
|
int ret;
|
||
|
|
||
|
kctx = talloc_get_type(cctx->rctx->pvt_ctx, struct kcm_ctx);
|
||
|
- req = talloc_get_type(cctx->state_ctx, struct kcm_req_ctx);
|
||
|
+ req = talloc_get_type(cctx->protocol_ctx, struct kcm_req_ctx);
|
||
|
if (req == NULL) {
|
||
|
/* A new request comes in, setup data structures. */
|
||
|
req = kcm_new_req(cctx, kctx);
|
||
|
@@ -503,7 +506,17 @@ static void kcm_recv(struct cli_ctx *cctx)
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
- cctx->state_ctx = req;
|
||
|
+ cctx->protocol_ctx = req;
|
||
|
+ }
|
||
|
+
|
||
|
+ /* Shared data between requests that originates in the same connection. */
|
||
|
+ if (cctx->state_ctx == NULL) {
|
||
|
+ cctx->state_ctx = talloc_zero(cctx, struct kcm_conn_data);
|
||
|
+ if (cctx->state_ctx == NULL) {
|
||
|
+ DEBUG(SSSDBG_CRIT_FAILURE, "Cannot set up client state\n");
|
||
|
+ talloc_free(cctx);
|
||
|
+ return;
|
||
|
+ }
|
||
|
}
|
||
|
|
||
|
ret = kcm_recv_data(req, cctx->cfd, &req->reqbuf);
|
||
|
@@ -558,7 +571,7 @@ static int kcm_send_data(struct cli_ctx *cctx)
|
||
|
struct kcm_req_ctx *req;
|
||
|
errno_t ret;
|
||
|
|
||
|
- req = talloc_get_type(cctx->state_ctx, struct kcm_req_ctx);
|
||
|
+ req = talloc_get_type(cctx->protocol_ctx, struct kcm_req_ctx);
|
||
|
|
||
|
ret = kcm_write_iovec(cctx->cfd, &req->repbuf.v_len);
|
||
|
if (ret != EOK) {
|
||
|
@@ -604,7 +617,7 @@ static void kcm_send(struct cli_ctx *cctx)
|
||
|
DEBUG(SSSDBG_TRACE_INTERNAL, "All data sent!\n");
|
||
|
TEVENT_FD_NOT_WRITEABLE(cctx->cfde);
|
||
|
TEVENT_FD_READABLE(cctx->cfde);
|
||
|
- talloc_zfree(cctx->state_ctx);
|
||
|
+ talloc_zfree(cctx->protocol_ctx);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
diff --git a/src/responder/kcm/kcmsrv_ops.c b/src/responder/kcm/kcmsrv_ops.c
|
||
|
index 7fc3b0a5c4e123a398ef103f3ce92b45bc68f5cf..6ae1f0c647f4d385477ddeadbad93287cba05c55 100644
|
||
|
--- a/src/responder/kcm/kcmsrv_ops.c
|
||
|
+++ b/src/responder/kcm/kcmsrv_ops.c
|
||
|
@@ -38,6 +38,7 @@
|
||
|
|
||
|
struct kcm_op_ctx {
|
||
|
struct kcm_resp_ctx *kcm_data;
|
||
|
+ struct kcm_conn_data *conn_data;
|
||
|
struct cli_creds *client;
|
||
|
|
||
|
struct sss_iobuf *input;
|
||
|
@@ -86,6 +87,7 @@ struct tevent_req *kcm_cmd_send(TALLOC_CTX *mem_ctx,
|
||
|
struct tevent_context *ev,
|
||
|
struct kcm_ops_queue_ctx *qctx,
|
||
|
struct kcm_resp_ctx *kcm_data,
|
||
|
+ struct kcm_conn_data *conn_data,
|
||
|
struct cli_creds *client,
|
||
|
struct kcm_data *input,
|
||
|
struct kcm_op *op)
|
||
|
@@ -135,6 +137,7 @@ struct tevent_req *kcm_cmd_send(TALLOC_CTX *mem_ctx,
|
||
|
}
|
||
|
|
||
|
state->op_ctx->kcm_data = kcm_data;
|
||
|
+ state->op_ctx->conn_data = conn_data;
|
||
|
state->op_ctx->client = client;
|
||
|
|
||
|
state->op_ctx->input = sss_iobuf_init_readonly(state->op_ctx,
|
||
|
diff --git a/src/responder/kcm/kcmsrv_ops.h b/src/responder/kcm/kcmsrv_ops.h
|
||
|
index 67d9f86026bf949548471f2280c130ebefd2f865..fd2dd03c9da3660e0c1346752e4db59c7cbe2c41 100644
|
||
|
--- a/src/responder/kcm/kcmsrv_ops.h
|
||
|
+++ b/src/responder/kcm/kcmsrv_ops.h
|
||
|
@@ -32,10 +32,15 @@ struct kcm_op;
|
||
|
struct kcm_op *kcm_get_opt(uint16_t opcode);
|
||
|
const char *kcm_opt_name(struct kcm_op *op);
|
||
|
|
||
|
+struct kcm_conn_data {
|
||
|
+ void *data;
|
||
|
+};
|
||
|
+
|
||
|
struct tevent_req *kcm_cmd_send(TALLOC_CTX *mem_ctx,
|
||
|
struct tevent_context *ev,
|
||
|
struct kcm_ops_queue_ctx *qctx,
|
||
|
struct kcm_resp_ctx *kcm_data,
|
||
|
+ struct kcm_conn_data *conn_data,
|
||
|
struct cli_creds *client,
|
||
|
struct kcm_data *input,
|
||
|
struct kcm_op *op);
|
||
|
--
|
||
|
2.25.4
|
||
|
|