diff options
author | Florian Weimer <fweimer@redhat.com> | 2016-05-13 16:55:01 +0200 |
---|---|---|
committer | Florian Weimer <fweimer@redhat.com> | 2016-05-24 10:59:55 +0200 |
commit | 25a34b0ac1356c1442380db2d2b13e05ccaeedd9 (patch) | |
tree | 846486d71da9869330e7f7f1a8618021b6a60bf7 | |
parent | 2143af6a47027c48d8dc168e255d8f527377bc56 (diff) | |
download | glibc-25a34b0ac1356c1442380db2d2b13e05ccaeedd9.zip glibc-25a34b0ac1356c1442380db2d2b13e05ccaeedd9.tar.gz glibc-25a34b0ac1356c1442380db2d2b13e05ccaeedd9.tar.bz2 |
tst-mallocfork2: Fix race condition, use fewer resources
The first SIGUSR1 signal could arrive when sigusr1_sender_pid
was still 0. As a result, kill would send SIGSTOP to the
entire process group. This would cause the test to hang before
printing any output.
This commit also adds a sched_yield to the signal source, so that
it does not flood the parent process with signals it has never a
chance to handle.
Even with these changes, tst-mallocfork2 still fails reliably
after the fix in commit commit 56290d6e762c1194547e73ff0b948cd79d3a1e03
(Increase fork signal safety for single-threaded processes) is
backed out.
(cherry picked from commit e2cd73a2ccabe8acae28719a0c3c1c03f2b5f9fb)
The backport increases the timeout to 20 seconds, in line with
the default on master. (The branch default of 2 seconds is too
tight.)
-rw-r--r-- | ChangeLog | 7 | ||||
-rw-r--r-- | malloc/tst-mallocfork2.c | 10 |
2 files changed, 16 insertions, 1 deletions
@@ -1,3 +1,10 @@ +2016-05-13 Florian Weimer <fweimer@redhat.com> + + Fix race condition in tst-mallocfork2, use fewer resources. + * malloc/tst-mallocfork2.c (sigusr1_handler): Do not send SIGSTOP + to current process group. + (signal_sender): Yield in the non-sleeping case. + 2016-05-12 Florian Weimer <fweimer@redhat.com> [BZ #19703] diff --git a/malloc/tst-mallocfork2.c b/malloc/tst-mallocfork2.c index a9e3e94..4b20f3c 100644 --- a/malloc/tst-mallocfork2.c +++ b/malloc/tst-mallocfork2.c @@ -25,6 +25,7 @@ still make fork unsafe, even in single-threaded processes. */ #include <errno.h> +#include <sched.h> #include <signal.h> #include <stdbool.h> #include <stdio.h> @@ -70,7 +71,9 @@ sigusr1_handler (int signo) signals from the subprocess. */ if (sigusr1_received) return; - if (kill (sigusr1_sender_pid, SIGSTOP) != 0) + /* sigusr1_sender_pid might not be initialized in the parent when + the first SIGUSR1 signal arrives. */ + if (sigusr1_sender_pid > 0 && kill (sigusr1_sender_pid, SIGSTOP) != 0) { write_message ("error: kill (SIGSTOP)\n"); abort (); @@ -123,6 +126,9 @@ signal_sender (int signo, bool sleep) } if (sleep) usleep (1 * 1000 * 1000); + else + /* Reduce the rate at which we send signals. */ + sched_yield (); } } @@ -208,5 +214,7 @@ do_test (void) return 0; } +#define TIMEOUT 20 + #define TEST_FUNCTION do_test () #include "../test-skeleton.c" |