commit e81f17d4c196aaed6893fd4beed49991caa3e2a4
Author:     Hiltjo Posthuma <[email protected]>
AuthorDate: Sun Apr 9 12:37:14 2023 +0200
Commit:     Hiltjo Posthuma <[email protected]>
CommitDate: Sun Apr 9 12:37:14 2023 +0200

    restore SIGCHLD sighandler to default before spawning a program
    
    From sigaction(2):
    A child created via fork(2) inherits a copy of its parent's signal 
dispositions.
    During an execve(2), the dispositions of handled signals are reset to the 
default;
    the dispositions of ignored signals are left unchanged.
    
    This refused to start directly some programs from configuring in config.h:
    
    static Key keys[] = {
            MODKEY,                       XK_o,      spawn,          {.v = cmd 
} },
    };
    
    Some reported programs that didn't start were: mpv, anki, dmenu_extended.
    
    Reported by pfx.
    Initial patch suggestion by Storkman.

diff --git a/dwm.c b/dwm.c
index c2bd871..f1d86b2 100644
--- a/dwm.c
+++ b/dwm.c
@@ -1647,12 +1647,20 @@ showhide(Client *c)
 void
 spawn(const Arg *arg)
 {
+       struct sigaction sa;
+
        if (arg->v == dmenucmd)
                dmenumon[0] = '0' + selmon->num;
        if (fork() == 0) {
                if (dpy)
                        close(ConnectionNumber(dpy));
                setsid();
+
+               sigemptyset(&sa.sa_mask);
+               sa.sa_flags = 0;
+               sa.sa_handler = SIG_DFL;
+               sigaction(SIGCHLD, &sa, NULL);
+
                execvp(((char **)arg->v)[0], (char **)arg->v);
                die("dwm: execvp '%s' failed:", ((char **)arg->v)[0]);
        }

Reply via email to