]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: fix struct Sigaction for Linux/ARM
authorShenghou Ma <minux.ma@gmail.com>
Tue, 19 Jun 2012 17:17:03 +0000 (01:17 +0800)
committerShenghou Ma <minux.ma@gmail.com>
Tue, 19 Jun 2012 17:17:03 +0000 (01:17 +0800)
        if we were to use sizeof(sa.sa_mask) instead of 8 as the last argument
        to rt_sigaction, we would have already fixed this bug, so also updated
        Linux/386 and Linux/amd64 files to use that; also test the return value
        of rt_sigaction.

R=dave, rsc
CC=golang-dev
https://golang.org/cl/6297087

src/pkg/runtime/defs_linux_arm.h
src/pkg/runtime/os_linux.h
src/pkg/runtime/signal_linux_386.c
src/pkg/runtime/signal_linux_amd64.c
src/pkg/runtime/signal_linux_arm.c

index 9e5c83a07968e816e3a635631d9cf0fcb1c18ec6..f72ec3d1b7405ab20c37c231be0b15b11f6ff7e3 100644 (file)
@@ -143,6 +143,6 @@ struct Sigaction {
        void *sa_handler;
        uint32 sa_flags;
        void *sa_restorer;
-       uint32 sa_mask;
+       uint64 sa_mask;
 };
 #pragma pack off
index 87daa3bb125733c8905f0439b84c50d864d5a633..357b60eb4546f40946929fb8d93c28ac38fcdb71 100644 (file)
@@ -10,7 +10,7 @@ int32 runtime·futex(uint32*, int32, uint32, Timespec*, uint32*, uint32);
 int32  runtime·clone(int32, void*, M*, G*, void(*)(void));
 
 struct Sigaction;
-void   runtime·rt_sigaction(uintptr, struct Sigaction*, void*, uintptr);
+int32  runtime·rt_sigaction(uintptr, struct Sigaction*, void*, uintptr);
 void   runtime·setsig(int32, void(*)(int32, Siginfo*, void*, G*), bool);
 void   runtime·sighandler(int32 sig, Siginfo *info, void *context, G *gp);
 
index b154ad88725fef92b16673564e8d48b739ee387c..4dbcb48f5207dc3014afb99a6078d29677ed76ab 100644 (file)
@@ -129,7 +129,8 @@ runtime·setsig(int32 i, void (*fn)(int32, Siginfo*, void*, G*), bool restart)
        if(fn == runtime·sighandler)
                fn = (void*)runtime·sigtramp;
        sa.k_sa_handler = fn;
-       runtime·rt_sigaction(i, &sa, nil, 8);
+       if(runtime·rt_sigaction(i, &sa, nil, sizeof(sa.sa_mask)) != 0)
+               runtime·throw("rt_sigaction failure");
 }
 
 #define AT_NULL                0
index 14095ba61cdf76ce658d568ac2c0305c2b2dacc3..8ff5be7859160980d1d90153113bf8e822a578f8 100644 (file)
@@ -139,5 +139,6 @@ runtime·setsig(int32 i, void (*fn)(int32, Siginfo*, void*, G*), bool restart)
        if(fn == runtime·sighandler)
                fn = (void*)runtime·sigtramp;
        sa.sa_handler = fn;
-       runtime·rt_sigaction(i, &sa, nil, 8);
+       if(runtime·rt_sigaction(i, &sa, nil, sizeof(sa.sa_mask)) != 0)
+               runtime·throw("rt_sigaction failure");
 }
index d20af688bda1e010fe09f5dd8c4d6ba1a41c1cc7..c35d139b27f875bb8e07120425aa7e8b5a557c55 100644 (file)
@@ -139,7 +139,8 @@ runtime·setsig(int32 i, void (*fn)(int32, Siginfo*, void*, G*), bool restart)
        if(fn == runtime·sighandler)
                fn = (void*)runtime·sigtramp;
        sa.sa_handler = fn;
-       runtime·rt_sigaction(i, &sa, nil, 8);
+       if(runtime·rt_sigaction(i, &sa, nil, sizeof(sa.sa_mask)) != 0)
+               runtime·throw("rt_sigaction failure");
 }
 
 #define AT_NULL                0