[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