The branch, v4-17-test has been updated via 7540755de6a s4:messaging: let imessaging_client_init() use imessaging_init_discard_incoming() via 28c65ce3e92 s3:auth_samba4: make use of imessaging_init_discard_incoming() via 68a0ef3b521 s4:messaging: add imessaging_init_discard_incoming() from 93d6f403e38 s3/utils: check result of talloc_strdup
https://git.samba.org/?p=samba.git;a=shortlog;h=v4-17-test - Log ----------------------------------------------------------------- commit 7540755de6a0fcc8b9b34fdcca777c77b8de9402 Author: Stefan Metzmacher <me...@samba.org> Date: Wed Sep 28 14:27:09 2022 +0200 s4:messaging: let imessaging_client_init() use imessaging_init_discard_incoming() imessaging_client_init() is for temporary stuff only, so we should drop (unexpected) incoming messages unless we expect irpc responses. BUG: https://bugzilla.samba.org/show_bug.cgi?id=15201 Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Ralph Boehme <s...@samba.org> Autobuild-User(master): Ralph Böhme <s...@samba.org> Autobuild-Date(master): Thu Oct 13 13:32:30 UTC 2022 on sn-devel-184 (cherry picked from commit 266bcedc18efc52e29efde6bad220623a5423e30) Autobuild-User(v4-17-test): Jule Anger <jan...@samba.org> Autobuild-Date(v4-17-test): Wed Oct 19 09:51:29 UTC 2022 on sn-devel-184 commit 28c65ce3e923deaa273e4dabd7c6228c803b03c7 Author: Stefan Metzmacher <me...@samba.org> Date: Wed Sep 28 14:14:41 2022 +0200 s3:auth_samba4: make use of imessaging_init_discard_incoming() Otherwise we'll generate a memory leak of imessaging_post_state/ tevent_immediate structures per incoming message! BUG: https://bugzilla.samba.org/show_bug.cgi?id=15201 Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Ralph Boehme <s...@samba.org> (cherry picked from commit 32df5e4961cf064b72bb496157cc6092126d9b8e) commit 68a0ef3b5215f37c74e7831db36a0b360ee661ca Author: Stefan Metzmacher <me...@samba.org> Date: Wed Sep 28 13:47:13 2022 +0200 s4:messaging: add imessaging_init_discard_incoming() We often create imessaging contexts just for sending messages, but we'll never process incoming messages because a temporary event context was used and we just queue a lot of imessaging_post_state structures with immediate events. With imessaging_init_discard_incoming() we'll discard any incoming messages unless we have pending irpc requests. BUG: https://bugzilla.samba.org/show_bug.cgi?id=15201 Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Ralph Boehme <s...@samba.org> (cherry picked from commit a120fb1c724dfaed5a99e34aaf979502586f17c0) ----------------------------------------------------------------------- Summary of changes: source3/auth/auth_samba4.c | 8 ++-- source4/lib/messaging/messaging.c | 74 +++++++++++++++++++++++++++++- source4/lib/messaging/messaging.h | 5 ++ source4/lib/messaging/messaging_internal.h | 9 ++++ 4 files changed, 90 insertions(+), 6 deletions(-) Changeset truncated at 500 lines: diff --git a/source3/auth/auth_samba4.c b/source3/auth/auth_samba4.c index ff8dc94d296..6c017ef4aa3 100644 --- a/source3/auth/auth_samba4.c +++ b/source3/auth/auth_samba4.c @@ -241,12 +241,12 @@ static NTSTATUS prepare_gensec(const struct auth_context *auth_context, return NT_STATUS_INVALID_SERVER_STATE; } - msg_ctx = imessaging_init(frame, + msg_ctx = imessaging_init_discard_incoming(frame, lp_ctx, *server_id, event_ctx); if (msg_ctx == NULL) { - DEBUG(1, ("imessaging_init failed\n")); + DEBUG(1, ("imessaging_init_discard_incoming failed\n")); TALLOC_FREE(frame); return NT_STATUS_INVALID_SERVER_STATE; } @@ -324,12 +324,12 @@ static NTSTATUS make_auth4_context_s4(const struct auth_context *auth_context, return NT_STATUS_INVALID_SERVER_STATE; } - msg_ctx = imessaging_init(frame, + msg_ctx = imessaging_init_discard_incoming(frame, lp_ctx, *server_id, event_ctx); if (msg_ctx == NULL) { - DEBUG(1, ("imessaging_init failed\n")); + DEBUG(1, ("imessaging_init_discard_incoming failed\n")); TALLOC_FREE(frame); return NT_STATUS_INVALID_SERVER_STATE; } diff --git a/source4/lib/messaging/messaging.c b/source4/lib/messaging/messaging.c index a00c35be0d5..8603c167ad4 100644 --- a/source4/lib/messaging/messaging.c +++ b/source4/lib/messaging/messaging.c @@ -429,6 +429,12 @@ static NTSTATUS imessaging_reinit(struct imessaging_context *msg) TALLOC_FREE(msg->msg_dgm_ref); + if (msg->discard_incoming) { + msg->num_incoming_listeners = 0; + } else { + msg->num_incoming_listeners = 1; + } + msg->server_id.pid = getpid(); msg->msg_dgm_ref = messaging_dgm_ref(msg, @@ -469,7 +475,9 @@ NTSTATUS imessaging_reinit_all(void) /* create the listening socket and setup the dispatcher */ -struct imessaging_context *imessaging_init(TALLOC_CTX *mem_ctx, +static struct imessaging_context *imessaging_init_internal( + TALLOC_CTX *mem_ctx, + bool discard_incoming, struct loadparm_context *lp_ctx, struct server_id server_id, struct tevent_context *ev) @@ -490,6 +498,12 @@ struct imessaging_context *imessaging_init(TALLOC_CTX *mem_ctx, return NULL; } msg->ev = ev; + msg->discard_incoming = discard_incoming; + if (msg->discard_incoming) { + msg->num_incoming_listeners = 0; + } else { + msg->num_incoming_listeners = 1; + } talloc_set_destructor(msg, imessaging_context_destructor); @@ -601,6 +615,36 @@ fail: return NULL; } +/* + create the listening socket and setup the dispatcher +*/ +struct imessaging_context *imessaging_init(TALLOC_CTX *mem_ctx, + struct loadparm_context *lp_ctx, + struct server_id server_id, + struct tevent_context *ev) +{ + bool discard_incoming = false; + return imessaging_init_internal(mem_ctx, + discard_incoming, + lp_ctx, + server_id, + ev); +} + +struct imessaging_context *imessaging_init_discard_incoming( + TALLOC_CTX *mem_ctx, + struct loadparm_context *lp_ctx, + struct server_id server_id, + struct tevent_context *ev) +{ + bool discard_incoming = true; + return imessaging_init_internal(mem_ctx, + discard_incoming, + lp_ctx, + server_id, + ev); +} + struct imessaging_post_state { struct imessaging_context *msg_ctx; struct imessaging_post_state **busy_ref; @@ -697,6 +741,22 @@ static void imessaging_dgm_recv(struct tevent_context *ev, return; } + if (msg->num_incoming_listeners == 0) { + struct server_id_buf selfbuf; + + message_hdr_get(&msg_type, &src, &dst, buf); + + DBG_DEBUG("not listening - discarding message from " + "src[%s] to dst[%s] (self[%s]) type=0x%x " + "on %s event context\n", + server_id_str_buf(src, &srcbuf), + server_id_str_buf(dst, &dstbuf), + server_id_str_buf(msg->server_id, &selfbuf), + (unsigned)msg_type, + (ev != msg->ev) ? "different" : "main"); + return; + } + if (ev != msg->ev) { int ret; ret = imessaging_post_self(msg, buf, buf_len); @@ -758,8 +818,9 @@ struct imessaging_context *imessaging_client_init(TALLOC_CTX *mem_ctx, /* This is because we are not in the s3 serverid database */ id.unique_id = SERVERID_UNIQUE_ID_NOT_TO_VERIFY; - return imessaging_init(mem_ctx, lp_ctx, id, ev); + return imessaging_init_discard_incoming(mem_ctx, lp_ctx, id, ev); } + /* a list of registered irpc server functions */ @@ -975,6 +1036,12 @@ static int irpc_destructor(struct irpc_request *irpc) { if (irpc->callid != -1) { idr_remove(irpc->msg_ctx->idr, irpc->callid); + if (irpc->msg_ctx->discard_incoming) { + SMB_ASSERT(irpc->msg_ctx->num_incoming_listeners > 0); + } else { + SMB_ASSERT(irpc->msg_ctx->num_incoming_listeners > 1); + } + irpc->msg_ctx->num_incoming_listeners -= 1; irpc->callid = -1; } @@ -1168,6 +1235,9 @@ static struct tevent_req *irpc_bh_raw_call_send(TALLOC_CTX *mem_ctx, state->irpc->incoming.handler = irpc_bh_raw_call_incoming_handler; state->irpc->incoming.private_data = req; + /* make sure we accept incoming messages */ + SMB_ASSERT(state->irpc->msg_ctx->num_incoming_listeners < UINT64_MAX); + state->irpc->msg_ctx->num_incoming_listeners += 1; talloc_set_destructor(state->irpc, irpc_destructor); /* setup the header */ diff --git a/source4/lib/messaging/messaging.h b/source4/lib/messaging/messaging.h index 3fd788d1e42..e7ae9e8cc46 100644 --- a/source4/lib/messaging/messaging.h +++ b/source4/lib/messaging/messaging.h @@ -49,6 +49,11 @@ struct imessaging_context *imessaging_init(TALLOC_CTX *mem_ctx, struct loadparm_context *lp_ctx, struct server_id server_id, struct tevent_context *ev); +struct imessaging_context *imessaging_init_discard_incoming( + TALLOC_CTX *mem_ctx, + struct loadparm_context *lp_ctx, + struct server_id server_id, + struct tevent_context *ev); void imessaging_dgm_unref_ev(struct tevent_context *ev); NTSTATUS imessaging_reinit_all(void); int imessaging_cleanup(struct imessaging_context *msg); diff --git a/source4/lib/messaging/messaging_internal.h b/source4/lib/messaging/messaging_internal.h index 5e99734ad60..ac254c22631 100644 --- a/source4/lib/messaging/messaging_internal.h +++ b/source4/lib/messaging/messaging_internal.h @@ -33,6 +33,15 @@ struct imessaging_context { struct server_id_db *names; struct timeval start_time; void *msg_dgm_ref; + /* + * The number of instances waiting for incoming + * messages. By default it's always greater than 0. + * + * If it's 0 we'll discard incoming messages, + * see imessaging_init_discard_imcoming(). + */ + bool discard_incoming; + uint64_t num_incoming_listeners; }; NTSTATUS imessaging_register_extra_handlers(struct imessaging_context *msg); -- Samba Shared Repository