The branch, v4-14-test has been updated
       via  1780305b193 ctdb: Fix a crash in run_proc_signal_handler()
       via  477da04a550 ctdb: Introduce output before and after the 10-second 
timeout
       via  95966b17f23 ctdb: Wait for SIGCHLD if script timed out
       via  a41f3fd29fe ctdb: Introduce a helper variable in run_event_test.c
       via  d700005983a ctdb: Call run_event_recv() in a callback function
       via  ee9fbada695 ctdb: fix typos
      from  42726c3f665 s3: smbd: Ensure POSIX default ACL is mapped into 
returned Windows ACL for directory handles.

https://git.samba.org/?p=samba.git;a=shortlog;h=v4-14-test


- Log -----------------------------------------------------------------
commit 1780305b1939d1f31612223c95f78340830f1a09
Author: Volker Lendecke <v...@samba.org>
Date:   Tue May 18 08:32:45 2021 +0200

    ctdb: Fix a crash in run_proc_signal_handler()
    
    If a script times out the caller can talloc_free() the script_list
    output of run_event_recv, which talloc_free's proc->output from
    run_proc.c as well. If the script generates further output after the
    timeout and then exits after a while, the SIGCHLD handler in the
    eventd tries to read into proc->output, which was already free'ed.
    
    Fix this by not doing just a talloc_steal but a talloc_move. This way
    proc_read_handler() called from run_proc_signal_handler() does not try
    to realloc the stale reference to proc->output but gets a NULL
    reference.
    
    I don't really know how to do a knownfail in ctdb, so this commit
    actually activates catching the signal by waiting long enough for
    22.bar to exit and generate the SIGCHLD.
    
    Bug: https://bugzilla.samba.org/show_bug.cgi?id=14475
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Ralph Boehme <s...@samba.org>
    (cherry picked from commit adef87a621b17baf746d12f991c60a8a3ffcfcd3)
    
    Autobuild-User(v4-14-test): Karolin Seeger <ksee...@samba.org>
    Autobuild-Date(v4-14-test): Tue May 25 09:51:20 UTC 2021 on sn-devel-184

commit 477da04a55003825802e56c783e4f3d184729a55
Author: Volker Lendecke <v...@samba.org>
Date:   Tue May 18 08:28:16 2021 +0200

    ctdb: Introduce output before and after the 10-second timeout
    
    This will lead to a crash in run_event_test.c soon
    
    Bug: https://bugzilla.samba.org/show_bug.cgi?id=14475
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Ralph Boehme <s...@samba.org>
    (cherry picked from commit f320d1a7ab0f81eefdb28b36bfe346eacb8980de)

commit 95966b17f23020d8574c861a3e4beda8dab0283b
Author: Volker Lendecke <v...@samba.org>
Date:   Tue May 18 08:23:05 2021 +0200

    ctdb: Wait for SIGCHLD if script timed out
    
    Bug: https://bugzilla.samba.org/show_bug.cgi?id=14475
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Ralph Boehme <s...@samba.org>
    (cherry picked from commit 19290f10c7d39e055847eb45affd9e229a116b18)

commit a41f3fd29fead4b36152743dc7bdce647c8d335d
Author: Volker Lendecke <v...@samba.org>
Date:   Tue May 18 08:18:25 2021 +0200

    ctdb: Introduce a helper variable in run_event_test.c
    
    Bug: https://bugzilla.samba.org/show_bug.cgi?id=14475
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Ralph Boehme <s...@samba.org>
    (cherry picked from commit 07ab9b7a71d59f3ff2b9dee662632315062213ab)

commit d700005983a45f11a481ff48be5c0d90dee7bbfe
Author: Volker Lendecke <v...@samba.org>
Date:   Tue May 18 08:01:06 2021 +0200

    ctdb: Call run_event_recv() in a callback function
    
    Triggers a different code path in run_event_* and aligns it more what
    the ctdb eventd really does.
    
    Bug: https://bugzilla.samba.org/show_bug.cgi?id=14475
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Ralph Boehme <s...@samba.org>
    (cherry picked from commit 9398d4b912387be8cde0c2ca30734eca7d547d19)

commit ee9fbada6958f67991997db31e6ab92d5b673065
Author: Volker Lendecke <v...@samba.org>
Date:   Fri May 7 17:36:58 2021 +0200

    ctdb: fix typos
    
    Bug: https://bugzilla.samba.org/show_bug.cgi?id=14475
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Ralph Boehme <s...@samba.org>
    (cherry picked from commit f188c9d732e4b9b3d37c4cb09608aba747845997)

-----------------------------------------------------------------------

Summary of changes:
 ctdb/common/run_proc.c                 |  6 ++--
 ctdb/tests/UNIT/cunit/run_event_001.sh |  3 ++
 ctdb/tests/src/run_event_test.c        | 52 +++++++++++++++++++++++++++-------
 3 files changed, 47 insertions(+), 14 deletions(-)


Changeset truncated at 500 lines:

diff --git a/ctdb/common/run_proc.c b/ctdb/common/run_proc.c
index 0c3c1de72fe..d55af6c3a1e 100644
--- a/ctdb/common/run_proc.c
+++ b/ctdb/common/run_proc.c
@@ -426,7 +426,7 @@ static void run_proc_done(struct tevent_req *req)
 
        state->result = state->proc->result;
        if (state->proc->output != NULL) {
-               state->output = talloc_steal(state, state->proc->output);
+               state->output = talloc_move(state, &state->proc->output);
        }
        talloc_steal(state, state->proc);
 
@@ -464,7 +464,7 @@ static void run_proc_timedout(struct tevent_req *subreq)
 
        state->result.err = ETIMEDOUT;
        if (state->proc->output != NULL) {
-               state->output = talloc_steal(state, state->proc->output);
+               state->output = talloc_move(state, &state->proc->output);
        }
        state->pid = state->proc->pid;
 
@@ -495,7 +495,7 @@ bool run_proc_recv(struct tevent_req *req, int *perr,
        }
 
        if (output != NULL) {
-               *output = talloc_steal(mem_ctx, state->output);
+               *output = talloc_move(mem_ctx, &state->output);
        }
 
        return true;
diff --git a/ctdb/tests/UNIT/cunit/run_event_001.sh 
b/ctdb/tests/UNIT/cunit/run_event_001.sh
index 50051bfaab2..4df3b4bdad6 100755
--- a/ctdb/tests/UNIT/cunit/run_event_001.sh
+++ b/ctdb/tests/UNIT/cunit/run_event_001.sh
@@ -113,7 +113,9 @@ unit_test run_event_test "$scriptdir" run 10 monitor
 cat > "$scriptdir/22.bar.script" <<EOF
 #!/bin/sh
 
+echo before sleep
 sleep 10
+echo after sleep
 EOF
 
 # Timed out script
@@ -124,6 +126,7 @@ unit_test run_event_test "$scriptdir" enable 22.bar
 
 ok <<EOF
 11.foo: hello
+22.bar: before sleep
 Event monitor completed with result=-$(errcode ETIMEDOUT)
 11.foo result=0
 22.bar result=-$(errcode ETIMEDOUT)
diff --git a/ctdb/tests/src/run_event_test.c b/ctdb/tests/src/run_event_test.c
index cfe5f161d1d..94548647014 100644
--- a/ctdb/tests/src/run_event_test.c
+++ b/ctdb/tests/src/run_event_test.c
@@ -52,6 +52,19 @@ static char *compact_args(const char **argv, int argc, int 
from)
        return arg_str;
 }
 
+static void run_done(struct tevent_req *req)
+{
+       struct run_event_script_list **script_list =
+               tevent_req_callback_data_void(req);
+       bool status;
+       int ret;
+
+       status = run_event_recv(req, &ret, NULL, script_list);
+       if (!status) {
+               fprintf(stderr, "run_event_recv() failed, ret=%d\n", ret);
+       }
+}
+
 static void do_run(TALLOC_CTX *mem_ctx, struct tevent_context *ev,
                   struct run_event_context *run_ctx,
                   int argc, const char **argv)
@@ -61,8 +74,8 @@ static void do_run(TALLOC_CTX *mem_ctx, struct tevent_context 
*ev,
        struct run_event_script_list *script_list = NULL;
        char *arg_str;
        unsigned int i;
-       int ret, t;
-       bool status;
+       int t;
+       bool wait_for_signal = false;
 
        if (argc < 5) {
                usage(argv[0]);
@@ -86,17 +99,13 @@ static void do_run(TALLOC_CTX *mem_ctx, struct 
tevent_context *ev,
                             timeout,
                             false);
        if (req == NULL) {
-               fprintf(stderr, "run_proc_send() failed\n");
+               fprintf(stderr, "run_event_send() failed\n");
                return;
        }
 
-       tevent_req_poll(req, ev);
+       tevent_req_set_callback(req, run_done, &script_list);
 
-       status = run_event_recv(req, &ret, mem_ctx, &script_list);
-       if (! status) {
-               fprintf(stderr, "run_proc_recv() failed, ret=%d\n", ret);
-               return;
-       }
+       tevent_req_poll(req, ev);
 
        if (script_list == NULL || script_list->num_scripts == 0) {
                printf("No event scripts found\n");
@@ -106,9 +115,30 @@ static void do_run(TALLOC_CTX *mem_ctx, struct 
tevent_context *ev,
        printf("Event %s completed with result=%d\n",
               argv[4], script_list->summary);
        for (i=0; i<script_list->num_scripts; i++) {
-               printf("%s result=%d\n", script_list->script[i].name,
-                      script_list->script[i].summary);
+               struct run_event_script *s = &script_list->script[i];
+               printf("%s result=%d\n", s->name, s->summary);
+
+               if (s->summary == -ETIMEDOUT) {
+                       wait_for_signal = true;
+               }
+       }
+
+       TALLOC_FREE(script_list);
+       TALLOC_FREE(req);
+
+       if (!wait_for_signal) {
+               return;
        }
+
+       req = tevent_wakeup_send(
+               ev, ev, tevent_timeval_current_ofs(10, 0));
+       if (req == NULL) {
+               fprintf(stderr, "Could not wait for signal\n");
+               return;
+       }
+
+       tevent_req_poll(req, ev);
+       TALLOC_FREE(req);
 }
 
 static void do_list(TALLOC_CTX *mem_ctx, struct tevent_context *ev,


-- 
Samba Shared Repository

Reply via email to