rfcomm sets SIGCHLD and SIGPIPE to SIG_IGN, which is inherited by child processes and preserved across execvp(). Many applications do not expect these signals to be ignored, causing all kinds of breakage (including the standard C system() function misbehaving on glibc and probably other libcs because waitpid() does not work when SIGCHLD is ignored). --- tools/rfcomm.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tools/rfcomm.c b/tools/rfcomm.c index e013ff588..f635d4aef 100644 --- a/tools/rfcomm.c +++ b/tools/rfcomm.c @@ -212,6 +212,7 @@ static void run_cmdline(struct pollfd *p, sigset_t *sigs, char *devname, int i; pid_t pid; char **cmdargv; + struct sigaction sa; cmdargv = malloc((argc + 1) * sizeof(char *)); if (!cmdargv) @@ -225,6 +226,11 @@ static void run_cmdline(struct pollfd *p, sigset_t *sigs, char *devname, switch (pid) { case 0: + memset(&sa, 0, sizeof(sa)); + sa.sa_handler = SIG_DFL; + sigaction(SIGCHLD, &sa, NULL); + sigaction(SIGPIPE, &sa, NULL); + i = execvp(cmdargv[0], cmdargv); fprintf(stderr, "Couldn't execute command %s (errno=%d:%s)\n", cmdargv[0], errno, strerror(errno)); -- TQ-Systems GmbH | Mühlstraße 2, Gut Delling | 82229 Seefeld, Germany Amtsgericht München, HRB 105018 Geschäftsführer: Detlef Schneider, Rüdiger Stahl, Stefan Schneider https://www.tq-group.com/