[SCM] Samba Shared Repository - branch v4-17-test updated
Jule Anger
janger at samba.org
Wed Oct 19 09:52:02 UTC 2022
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 <metze at 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 <metze at samba.org>
Reviewed-by: Ralph Boehme <slow at samba.org>
Autobuild-User(master): Ralph Böhme <slow at 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 <janger at samba.org>
Autobuild-Date(v4-17-test): Wed Oct 19 09:51:29 UTC 2022 on sn-devel-184
commit 28c65ce3e923deaa273e4dabd7c6228c803b03c7
Author: Stefan Metzmacher <metze at 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 <metze at samba.org>
Reviewed-by: Ralph Boehme <slow at samba.org>
(cherry picked from commit 32df5e4961cf064b72bb496157cc6092126d9b8e)
commit 68a0ef3b5215f37c74e7831db36a0b360ee661ca
Author: Stefan Metzmacher <metze at 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 <metze at samba.org>
Reviewed-by: Ralph Boehme <slow at 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
More information about the samba-cvs
mailing list