From: Shenghou Ma Date: Tue, 19 Jun 2012 17:17:03 +0000 (+0800) Subject: runtime: fix struct Sigaction for Linux/ARM X-Git-Tag: go1.1rc2~2912 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=d4c4f4d2c4cdfc9e713383d419b528726cfbbb20;p=gostls13.git runtime: fix struct Sigaction for Linux/ARM 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 --- diff --git a/src/pkg/runtime/defs_linux_arm.h b/src/pkg/runtime/defs_linux_arm.h index 9e5c83a079..f72ec3d1b7 100644 --- a/src/pkg/runtime/defs_linux_arm.h +++ b/src/pkg/runtime/defs_linux_arm.h @@ -143,6 +143,6 @@ struct Sigaction { void *sa_handler; uint32 sa_flags; void *sa_restorer; - uint32 sa_mask; + uint64 sa_mask; }; #pragma pack off diff --git a/src/pkg/runtime/os_linux.h b/src/pkg/runtime/os_linux.h index 87daa3bb12..357b60eb45 100644 --- a/src/pkg/runtime/os_linux.h +++ b/src/pkg/runtime/os_linux.h @@ -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); diff --git a/src/pkg/runtime/signal_linux_386.c b/src/pkg/runtime/signal_linux_386.c index b154ad8872..4dbcb48f52 100644 --- a/src/pkg/runtime/signal_linux_386.c +++ b/src/pkg/runtime/signal_linux_386.c @@ -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 diff --git a/src/pkg/runtime/signal_linux_amd64.c b/src/pkg/runtime/signal_linux_amd64.c index 14095ba61c..8ff5be7859 100644 --- a/src/pkg/runtime/signal_linux_amd64.c +++ b/src/pkg/runtime/signal_linux_amd64.c @@ -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"); } diff --git a/src/pkg/runtime/signal_linux_arm.c b/src/pkg/runtime/signal_linux_arm.c index d20af688bd..c35d139b27 100644 --- a/src/pkg/runtime/signal_linux_arm.c +++ b/src/pkg/runtime/signal_linux_arm.c @@ -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