]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: fix running under nohup
authorRuss Cox <rsc@golang.org>
Fri, 15 Feb 2013 16:18:55 +0000 (11:18 -0500)
committerRuss Cox <rsc@golang.org>
Fri, 15 Feb 2013 16:18:55 +0000 (11:18 -0500)
There are two ways nohup(1) might be implemented:
it might mask away the signal, or it might set the handler
to SIG_IGN, both of which are inherited across fork+exec.
So two fixes:

* Make sure to preserve the inherited signal mask at
minit instead of clearing it.

* If the SIGHUP handler is SIG_IGN, leave it that way.

Fixes #4491.

R=golang-dev, mikioh.mikioh, iant
CC=golang-dev
https://golang.org/cl/7308102

24 files changed:
src/pkg/runtime/os_darwin.h
src/pkg/runtime/os_freebsd.h
src/pkg/runtime/os_linux.h
src/pkg/runtime/os_netbsd.h
src/pkg/runtime/os_openbsd.h
src/pkg/runtime/runtime.h
src/pkg/runtime/signal_darwin_386.c
src/pkg/runtime/signal_darwin_amd64.c
src/pkg/runtime/signal_freebsd_386.c
src/pkg/runtime/signal_freebsd_amd64.c
src/pkg/runtime/signal_freebsd_arm.c
src/pkg/runtime/signal_linux_386.c
src/pkg/runtime/signal_linux_amd64.c
src/pkg/runtime/signal_linux_arm.c
src/pkg/runtime/signal_netbsd_386.c
src/pkg/runtime/signal_netbsd_amd64.c
src/pkg/runtime/signal_netbsd_arm.c
src/pkg/runtime/signal_openbsd_386.c
src/pkg/runtime/signal_openbsd_amd64.c
src/pkg/runtime/thread_darwin.c
src/pkg/runtime/thread_freebsd.c
src/pkg/runtime/thread_linux.c
src/pkg/runtime/thread_netbsd.c
src/pkg/runtime/thread_openbsd.c

index 70cfcce8467a75f8f1767c3abcde9a08d2ff55ee..83386fa94f3f78b7ecd0ff3b1c413072cd8d2bdd 100644 (file)
@@ -4,6 +4,7 @@
 
 #define SIG_DFL ((void*)0)
 #define SIG_IGN ((void*)1)
+#define SIGHUP 1
 
 int32  runtime·bsdthread_create(void*, M*, G*, void(*)(void));
 int32  runtime·bsdthread_register(void);
index b440bfeec65bdefc56cd686ef4b20350a406fb65..cb01e39e0a5c7efef2ebab7b38e2f90a1f27e82e 100644 (file)
@@ -1,5 +1,6 @@
 #define SIG_DFL ((void*)0)
 #define SIG_IGN ((void*)1)
+#define SIGHUP 1
 
 int32  runtime·thr_new(ThrParam*, int32);
 void   runtime·sighandler(int32 sig, Siginfo *info, void *context, G *gp);
index 357b60eb4546f40946929fb8d93c28ac38fcdb71..5ae5d24feb9c2d8d08d269df8d6ea5e8453b747e 100644 (file)
@@ -4,6 +4,7 @@
 
 #define SIG_DFL ((void*)0)
 #define SIG_IGN ((void*)1)
+#define SIGHUP 1
 
 // Linux-specific system calls
 int32  runtime·futex(uint32*, int32, uint32, Timespec*, uint32*, uint32);
index 09e68323505e75c3332ead306a4dff7ed23b4fbc..13a62792703a0f06a30fb442c0642a9dc97c03e9 100644 (file)
@@ -4,6 +4,7 @@
 
 #define SIG_DFL ((void*)0)
 #define SIG_IGN ((void*)1)
+#define SIGHUP 1
 
 #define SIG_BLOCK 1
 #define SIG_UNBLOCK 2
index b2d79e7f998fafe5522ea1b2adc9c9ea58261759..2c6f3c4e905a0dbd4bd3cd34f99b020b51afd530 100644 (file)
@@ -4,6 +4,7 @@
 
 #define SIG_DFL ((void*)0)
 #define SIG_IGN ((void*)1)
+#define SIGHUP 1
 
 #define SIG_BLOCK 1
 #define SIG_UNBLOCK 2
index 77f60cb4b58f4bc95450938b2f7534cb52555e47..6709e4f261e741e26373a7b23225b2b9be341b11 100644 (file)
@@ -290,6 +290,7 @@ struct      M
        GCStats gcstats;
        bool    racecall;
        void*   racepc;
+       void*   sigset;
        uint32  moreframesize_minalloc;
 
        uintptr settype_buf[1024];
index aeb0f43223619b6b592bd03fef83026079287abc..deb16d7a60ebc42839f79b6e5c8b1da407fff7fd 100644 (file)
@@ -133,6 +133,15 @@ runtime·setsig(int32 i, void (*fn)(int32, Siginfo*, void*, G*), bool restart)
 {
        Sigaction sa;
 
+       // If SIGHUP handler is SIG_IGN, assume running
+       // under nohup and do not set explicit handler.
+       if(i == SIGHUP) {
+               runtime·memclr((byte*)&sa, sizeof sa);
+               runtime·sigaction(i, nil, &sa);
+               if(*(void**)sa.__sigaction_u == SIG_IGN)
+                       return;
+       }
+
        runtime·memclr((byte*)&sa, sizeof sa);
        sa.sa_flags = SA_SIGINFO|SA_ONSTACK;
        if(restart)
index 326fdd4f26944410149a85e4984a6ab2f3db8e6e..33dc9a6be5a17099c95a7c9d26aa219052f2aac3 100644 (file)
@@ -143,6 +143,15 @@ runtime·setsig(int32 i, void (*fn)(int32, Siginfo*, void*, G*), bool restart)
 {
        Sigaction sa;
 
+       // If SIGHUP handler is SIG_IGN, assume running
+       // under nohup and do not set explicit handler.
+       if(i == SIGHUP) {
+               runtime·memclr((byte*)&sa, sizeof sa);
+               runtime·sigaction(i, nil, &sa);
+               if(*(void**)sa.__sigaction_u == SIG_IGN)
+                       return;
+       }
+               
        runtime·memclr((byte*)&sa, sizeof sa);
        sa.sa_flags = SA_SIGINFO|SA_ONSTACK;
        if(restart)
index ae9f7321b932709da6d0cbf123c8b5c0a3ab4317..3fbfee3f5c5c2bc629cae9d104b5a48eccf7dfa7 100644 (file)
@@ -128,6 +128,15 @@ runtime·setsig(int32 i, void (*fn)(int32, Siginfo*, void*, G*), bool restart)
 {
        Sigaction sa;
 
+       // If SIGHUP handler is SIG_IGN, assume running
+       // under nohup and do not set explicit handler.
+       if(i == SIGHUP) {
+               runtime·memclr((byte*)&sa, sizeof sa);
+               runtime·sigaction(i, nil, &sa);
+               if(sa.__sigaction_u.__sa_sigaction == SIG_IGN)
+                       return;
+       }
+
        runtime·memclr((byte*)&sa, sizeof sa);
        sa.sa_flags = SA_SIGINFO|SA_ONSTACK;
        if(restart)
index 19382ec944a2824baddae3305c0cef65096ccbad..443e30cf865f778ea45b8ba48e65a212f213cacd 100644 (file)
@@ -136,6 +136,15 @@ runtime·setsig(int32 i, void (*fn)(int32, Siginfo*, void*, G*), bool restart)
 {
        Sigaction sa;
 
+       // If SIGHUP handler is SIG_IGN, assume running
+       // under nohup and do not set explicit handler.
+       if(i == SIGHUP) {
+               runtime·memclr((byte*)&sa, sizeof sa);
+               runtime·sigaction(i, nil, &sa);
+               if(sa.__sigaction_u.__sa_sigaction == SIG_IGN)
+                       return;
+       }
+
        runtime·memclr((byte*)&sa, sizeof sa);
        sa.sa_flags = SA_SIGINFO|SA_ONSTACK;
        if(restart)
index e2bd9e8a2ffe136f5bdae7f15c62b938a6b11658..6cd532d6cbbe1cb86bdcaca819d82b4c88a8846b 100644 (file)
@@ -151,6 +151,15 @@ runtime·setsig(int32 i, void (*fn)(int32, Siginfo*, void*, G*), bool restart)
 {
        Sigaction sa;
 
+       // If SIGHUP handler is SIG_IGN, assume running
+       // under nohup and do not set explicit handler.
+       if(i == SIGHUP) {
+               runtime·memclr((byte*)&sa, sizeof sa);
+               runtime·sigaction(i, nil, &sa);
+               if(sa.__sigaction_u.__sa_sigaction == SIG_IGN)
+                       return;
+       }
+
        runtime·memclr((byte*)&sa, sizeof sa);
        sa.sa_flags = SA_SIGINFO|SA_ONSTACK;
        if(restart)
index 40e64013cff69dd0c0025cb939471f30d3137256..cc4c8db5ca993b2578aedaaef5610d98167bed2b 100644 (file)
@@ -124,6 +124,15 @@ runtime·setsig(int32 i, void (*fn)(int32, Siginfo*, void*, G*), bool restart)
 {
        Sigaction sa;
 
+       // If SIGHUP handler is SIG_IGN, assume running
+       // under nohup and do not set explicit handler.
+       if(i == SIGHUP) {
+               runtime·memclr((byte*)&sa, sizeof sa);
+               runtime·sigaction(i, nil, &sa);
+               if(sa.k_sa_handler == SIG_IGN)
+                       return;
+       }
+
        runtime·memclr((byte*)&sa, sizeof sa);
        sa.sa_flags = SA_ONSTACK | SA_SIGINFO | SA_RESTORER;
        if(restart)
index 0c3a1e21737f4a902fb81c8a848883ed8a6f3514..6ca51f8c44c2526c3d3250256cc3880c4b8ff8ba 100644 (file)
@@ -134,6 +134,15 @@ runtime·setsig(int32 i, void (*fn)(int32, Siginfo*, void*, G*), bool restart)
 {
        Sigaction sa;
 
+       // If SIGHUP handler is SIG_IGN, assume running
+       // under nohup and do not set explicit handler.
+       if(i == SIGHUP) {
+               runtime·memclr((byte*)&sa, sizeof sa);
+               runtime·sigaction(i, nil, &sa);
+               if(sa.sa_handler == SIG_IGN)
+                       return;
+       }
+
        runtime·memclr((byte*)&sa, sizeof sa);
        sa.sa_flags = SA_ONSTACK | SA_SIGINFO | SA_RESTORER;
        if(restart)
index c425696d56ff1efc3d0c2cd086d6fd99f44e5718..53ab07d36f80e9a8fe69d88257442ec8cf420c54 100644 (file)
@@ -140,6 +140,15 @@ runtime·setsig(int32 i, void (*fn)(int32, Siginfo*, void*, G*), bool restart)
 {
        Sigaction sa;
 
+       // If SIGHUP handler is SIG_IGN, assume running
+       // under nohup and do not set explicit handler.
+       if(i == SIGHUP) {
+               runtime·memclr((byte*)&sa, sizeof sa);
+               runtime·sigaction(i, nil, &sa);
+               if(sa.sa_handler == SIG_IGN)
+                       return;
+       }
+
        runtime·memclr((byte*)&sa, sizeof sa);
        sa.sa_flags = SA_ONSTACK | SA_SIGINFO | SA_RESTORER;
        if(restart)
index 34fa90bb2492408ef00308ce87db000a9c9d10f3..f788f12f55f13f96e72a0a0f89fbfd7c797f2c50 100644 (file)
@@ -128,6 +128,15 @@ runtime·setsig(int32 i, void (*fn)(int32, Siginfo*, void*, G*), bool restart)
 {
        Sigaction sa;
 
+       // If SIGHUP handler is SIG_IGN, assume running
+       // under nohup and do not set explicit handler.
+       if(i == SIGHUP) {
+               runtime·memclr((byte*)&sa, sizeof sa);
+               runtime·sigaction(i, nil, &sa);
+               if(sa._sa_u._sa_sigaction == SIG_IGN)
+                       return;
+       }
+
        runtime·memclr((byte*)&sa, sizeof sa);
        sa.sa_flags = SA_SIGINFO|SA_ONSTACK;
        if(restart)
index e9e1eaa557cabfd7600f5e214f2b20c6ca8f6fdf..5bdc143ad001a027eb58c240788adb737bbf85f7 100644 (file)
@@ -135,6 +135,15 @@ runtime·setsig(int32 i, void (*fn)(int32, Siginfo*, void*, G*), bool restart)
 {
        Sigaction sa;
 
+       // If SIGHUP handler is SIG_IGN, assume running
+       // under nohup and do not set explicit handler.
+       if(i == SIGHUP) {
+               runtime·memclr((byte*)&sa, sizeof sa);
+               runtime·sigaction(i, nil, &sa);
+               if(sa._sa_u._sa_sigaction == SIG_IGN)
+                       return;
+       }
+
        runtime·memclr((byte*)&sa, sizeof sa);
        sa.sa_flags = SA_SIGINFO|SA_ONSTACK;
        if(restart)
index bc39a69b0e7da589e374f56c78a38a2e1f85a731..5dfea5ca1c39ff110b35d4c264ea06ee3eda11d0 100644 (file)
@@ -157,6 +157,15 @@ runtime·setsig(int32 i, void (*fn)(int32, Siginfo*, void*, G*), bool restart)
 {
        Sigaction sa;
 
+       // If SIGHUP handler is SIG_IGN, assume running
+       // under nohup and do not set explicit handler.
+       if(i == SIGHUP) {
+               runtime·memclr((byte*)&sa, sizeof sa);
+               runtime·sigaction(i, nil, &sa);
+               if(sa._sa_u._sa_sigaction == SIG_IGN)
+                       return;
+       }
+
        runtime·memclr((byte*)&sa, sizeof sa);
        sa.sa_flags = SA_SIGINFO|SA_ONSTACK;
        if(restart)
index bd040bd0eb9d258dbaced4df1bc2a859a917cd65..e1537fed825d54b984b920cf3e57e0f47f0dd2a1 100644 (file)
@@ -124,6 +124,15 @@ runtime·setsig(int32 i, void (*fn)(int32, Siginfo*, void*, G*), bool restart)
 {
        Sigaction sa;
 
+       // If SIGHUP handler is SIG_IGN, assume running
+       // under nohup and do not set explicit handler.
+       if(i == SIGHUP) {
+               runtime·memclr((byte*)&sa, sizeof sa);
+               runtime·sigaction(i, nil, &sa);
+               if(sa.__sigaction_u.__sa_sigaction == SIG_IGN)
+                       return;
+       }
+
        runtime·memclr((byte*)&sa, sizeof sa);
        sa.sa_flags = SA_SIGINFO|SA_ONSTACK;
        if(restart)
index 3fdd3fbd18381308c2e2e13d711b61691a43a66e..a82d5163c6313f573438e885b58de28e15f7c92c 100644 (file)
@@ -133,6 +133,15 @@ runtime·setsig(int32 i, void (*fn)(int32, Siginfo*, void*, G*), bool restart)
 {
        Sigaction sa;
 
+       // If SIGHUP handler is SIG_IGN, assume running
+       // under nohup and do not set explicit handler.
+       if(i == SIGHUP) {
+               runtime·memclr((byte*)&sa, sizeof sa);
+               runtime·sigaction(i, nil, &sa);
+               if(sa.__sigaction_u.__sa_sigaction == SIG_IGN)
+                       return;
+       }
+
        runtime·memclr((byte*)&sa, sizeof sa);
        sa.sa_flags = SA_SIGINFO|SA_ONSTACK;
        if(restart)
index 0758d6858db6637c18bf0933de3677bc725a0a40..d55ec8dc3ed8b3d85f134738c1c152c1489ed1f5 100644 (file)
@@ -10,7 +10,6 @@
 extern SigTab runtime·sigtab[];
 
 static Sigset sigset_all = ~(Sigset)0;
-static Sigset sigset_none;
 static Sigset sigset_prof = 1<<(SIGPROF-1);
 
 static void
@@ -99,6 +98,8 @@ runtime·newosproc(M *mp, G *gp, void *stk, void (*fn)(void))
        }
 
        runtime·sigprocmask(SIG_SETMASK, &sigset_all, &oset);
+       mp->sigset = runtime·mal(sizeof(Sigset));
+       *(Sigset*)mp->sigset = oset;
        errno = runtime·bsdthread_create(stk, mp, gp, fn);
        runtime·sigprocmask(SIG_SETMASK, &oset, nil);
 
@@ -116,10 +117,9 @@ runtime·minit(void)
        m->gsignal = runtime·malg(32*1024);    // OS X wants >=8K, Linux >=2K
        runtime·signalstack((byte*)m->gsignal->stackguard - StackGuard, 32*1024);
 
-       if(m->profilehz > 0)
-               runtime·sigprocmask(SIG_SETMASK, &sigset_none, nil);
-       else
-               runtime·sigprocmask(SIG_SETMASK, &sigset_prof, nil);
+       if(m->sigset != nil)
+               runtime·sigprocmask(SIG_SETMASK, m->sigset, nil);
+       runtime·setprof(m->profilehz > 0);
 }
 
 // Mach IPC, to get at semaphores
index eba794cb333d0ee37eb6cef8742c4f77a15f1345..0521576050257caeeef7ed57e5b2c9506e3f04d9 100644 (file)
@@ -14,7 +14,6 @@ extern int32 runtime·sys_umtx_op(uint32*, int32, uint32, void*, void*);
 #define        HW_NCPU 3
 
 static Sigset sigset_all = { ~(uint32)0, ~(uint32)0, ~(uint32)0, ~(uint32)0, };
-static Sigset sigset_none = { 0, 0, 0, 0, };
 
 static int32
 getncpu(void)
@@ -91,6 +90,8 @@ runtime·newosproc(M *mp, G *gp, void *stk, void (*fn)(void))
        }
 
        runtime·sigprocmask(&sigset_all, &oset);
+       mp->sigset = runtime·mal(sizeof(Sigset));
+       *(Sigset*)mp->sigset = oset;
        runtime·memclr((byte*)&param, sizeof param);
 
        param.start_func = runtime·thr_start;
@@ -127,7 +128,8 @@ runtime·minit(void)
        // Initialize signal handling
        m->gsignal = runtime·malg(32*1024);
        runtime·signalstack((byte*)m->gsignal->stackguard - StackGuard, 32*1024);
-       runtime·sigprocmask(&sigset_none, nil);
+       if(m->sigset != nil)
+               runtime·sigprocmask(m->sigset, nil);
 }
 
 void
index 778b9078b90f2a6c5d74080acee5575c2954bab4..604b98e57fa362b5af8182d64af8feee11bf3dfc 100644 (file)
@@ -14,7 +14,6 @@ int32 runtime·close(int32);
 int32 runtime·read(int32, void*, int32);
 
 static Sigset sigset_all = { ~(uint32)0, ~(uint32)0 };
-static Sigset sigset_none;
 
 // Linux futex.
 //
@@ -149,6 +148,8 @@ runtime·newosproc(M *mp, G *gp, void *stk, void (*fn)(void))
        // Disable signals during clone, so that the new thread starts
        // with signals disabled.  It will enable them in minit.
        runtime·rtsigprocmask(SIG_SETMASK, &sigset_all, &oset, sizeof oset);
+       mp->sigset = runtime·mal(sizeof(Sigset));
+       *(Sigset*)mp->sigset = oset;
        ret = runtime·clone(flags, stk, mp, gp, fn);
        runtime·rtsigprocmask(SIG_SETMASK, &oset, nil, sizeof oset);
 
@@ -177,7 +178,8 @@ runtime·minit(void)
        // Initialize signal handling.
        m->gsignal = runtime·malg(32*1024);    // OS X wants >=8K, Linux >=2K
        runtime·signalstack((byte*)m->gsignal->stackguard - StackGuard, 32*1024);
-       runtime·rtsigprocmask(SIG_SETMASK, &sigset_none, nil, sizeof sigset_none);
+       if(m->sigset != nil)
+               runtime·rtsigprocmask(SIG_SETMASK, m->sigset, nil, sizeof *m->sigset);
 }
 
 void
index cf66d9c79784bcfa124fc9f73c1c66b206247a7d..c689b55dfefafeeedbfa3dfed93a5b0149d6008f 100644 (file)
@@ -21,7 +21,6 @@ enum
 extern SigTab runtime·sigtab[];
 
 static Sigset sigset_all = { ~(uint32)0, ~(uint32)0, ~(uint32)0, ~(uint32)0, };
-static Sigset sigset_none;
 
 extern void runtime·getcontext(UcontextT *context);
 extern int32 runtime·lwp_create(UcontextT *context, uintptr flags, void *lwpid);
@@ -164,6 +163,9 @@ runtime·newosproc(M *mp, G *gp, void *stk, void (*fn)(void))
        uc.uc_link = nil;
        uc.uc_sigmask = sigset_all;
 
+       mp->sigset = runtime·mal(sizeof(Sigset));
+       runtime·sigprocmask(SIG_SETMASK, nil, mp->sigset);
+
        runtime·lwp_mcontext_init(&uc.uc_mcontext, stk, mp, gp, fn);
 
        ret = runtime·lwp_create(&uc, 0, &mp->procid);
@@ -195,7 +197,8 @@ runtime·minit(void)
        // Initialize signal handling
        m->gsignal = runtime·malg(32*1024);
        runtime·signalstack((byte*)m->gsignal->stackguard - StackGuard, 32*1024);
-       runtime·sigprocmask(SIG_SETMASK, &sigset_none, nil);
+       if(m->sigset != nil)
+               runtime·sigprocmask(SIG_SETMASK, m->sigset, nil);
 }
 
 void
index fd42f28e8bd5c223c189fd6857d93aa77f04c678..4d30193c000442f6f0d187bb6084bbed8eb8b2ff 100644 (file)
@@ -21,7 +21,6 @@ enum
 extern SigTab runtime·sigtab[];
 
 static Sigset sigset_all = ~(Sigset)0;
-static Sigset sigset_none;
 
 extern int64 runtime·tfork(void *param, uintptr psize, M *mp, G *gp, void (*fn)(void));
 extern int32 runtime·thrsleep(void *ident, int32 clock_id, void *tsp, void *lock, const int32 *abort);
@@ -142,6 +141,8 @@ runtime·newosproc(M *mp, G *gp, void *stk, void (*fn)(void))
        param.tf_stack = stk;
 
        oset = runtime·sigprocmask(SIG_SETMASK, sigset_all);
+       mp->sigset = runtime·mal(sizeof(Sigset));
+       *(Sigset*)mp->sigset = oset;
        ret = runtime·tfork((byte*)&param, sizeof(param), mp, gp, fn);
        runtime·sigprocmask(SIG_SETMASK, oset);
 
@@ -172,7 +173,8 @@ runtime·minit(void)
        // Initialize signal handling
        m->gsignal = runtime·malg(32*1024);
        runtime·signalstack((byte*)m->gsignal->stackguard - StackGuard, 32*1024);
-       runtime·sigprocmask(SIG_SETMASK, sigset_none);
+       if(m->sigset != nil)
+               runtime·sigprocmask(SIG_SETMASK, m->sigset, nil, sizeof *m->sigset);
 }
 
 void