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

Reply via email to