Message ID | 20240215083954.5233-1-matthias.schiffer@ew.tq-group.com |
---|---|
State | New |
Headers | show |
Series | [BlueZ,1/2] tools/rfcomm: reset ignored signals after fork | expand |
Hello: This series was applied to bluetooth/bluez.git (master) by Luiz Augusto von Dentz <luiz.von.dentz@intel.com>: On Thu, 15 Feb 2024 09:39:53 +0100 you wrote: > 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(+) Here is the summary with links: - [BlueZ,1/2] tools/rfcomm: reset ignored signals after fork https://git.kernel.org/pub/scm/bluetooth/bluez.git/?id=854dcb7c2bbd - [BlueZ,2/2] tools/rfcomm: _exit() on execvp() failure https://git.kernel.org/pub/scm/bluetooth/bluez.git/?id=f79ccf6c429e You are awesome, thank you!
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));