From e72383825bbd48524bef19feb9893cdb05107f15 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=BD=D0=B0=D0=B1?= Date: Fri, 21 May 2021 01:37:38 +0200 Subject: [PATCH] raidz_test: use only async-signal-safe functions in signal handler MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit execl*() before glibc 2.24 could allocate, but only if called with at least 1024 arguments, which five isn't errno modification is also fine, so long as we restore it at the end Reviewed-by: Brian Behlendorf Signed-off-by: Ahelenia ZiemiaƄska Closes #12086 --- cmd/raidz_test/raidz_test.c | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/cmd/raidz_test/raidz_test.c b/cmd/raidz_test/raidz_test.c index 9a8be549c5cb..c1610a8d1b0c 100644 --- a/cmd/raidz_test/raidz_test.c +++ b/cmd/raidz_test/raidz_test.c @@ -37,11 +37,11 @@ static int *rand_data; raidz_test_opts_t rto_opts; -static char gdb[256]; -static const char gdb_tmpl[] = "gdb -ex \"set pagination 0\" -p %d"; +static char pid_s[16]; static void sig_handler(int signo) { + int old_errno = errno; struct sigaction action; /* * Restore default action and re-raise signal so SIGSEGV and @@ -52,10 +52,19 @@ static void sig_handler(int signo) action.sa_flags = 0; (void) sigaction(signo, &action, NULL); - if (rto_opts.rto_gdb) - if (system(gdb)) { } + if (rto_opts.rto_gdb) { + pid_t pid = fork(); + if (pid == 0) { + execlp("gdb", "gdb", "-ex", "set pagination 0", + "-p", pid_s, NULL); + _exit(-1); + } else if (pid > 0) + while (waitpid(pid, NULL, 0) == -1 && errno == EINTR) + ; + } raise(signo); + errno = old_errno; } static void print_opts(raidz_test_opts_t *opts, boolean_t force) @@ -978,8 +987,8 @@ main(int argc, char **argv) struct sigaction action; int err = 0; - /* init gdb string early */ - (void) sprintf(gdb, gdb_tmpl, getpid()); + /* init gdb pid string early */ + (void) sprintf(pid_s, "%d", getpid()); action.sa_handler = sig_handler; sigemptyset(&action.sa_mask);