diff mbox series

[BlueZ,1/2] tools/rfcomm: reset ignored signals after fork

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

Commit Message

Matthias Schiffer Feb. 15, 2024, 8:39 a.m. UTC
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(+)

Comments

patchwork-bot+bluetooth@kernel.org Feb. 20, 2024, 1:50 p.m. UTC | #1
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 mbox series

Patch

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));