From 92d72e3b846a8ba258831a30510742d3b7b53609 Mon Sep 17 00:00:00 2001 From: Eric Blake Date: Fri, 31 Dec 2010 12:36:15 -0700 Subject: [PATCH] signal: work around Haiku issue with SIGBUS * lib/siglist.h: Add comment. * lib/sig2str.c (numname_table): Swap SIGBUS order, to match strsignal's favoring of SIGSEGV. * tests/test-signal.c (main): Avoid test failure. * doc/posix-headers/signal.texi (signal.h): Document the issue. Reported by Scott McCreary. Signed-off-by: Eric Blake --- ChangeLog | 8 ++++++++ doc/posix-headers/signal.texi | 4 ++++ lib/sig2str.c | 10 ++++++---- lib/siglist.h | 3 +++ tests/test-signal.c | 3 ++- 5 files changed, 23 insertions(+), 5 deletions(-) diff --git a/ChangeLog b/ChangeLog index 5e319f92c..d638bdf9c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -350,6 +350,14 @@ 2010-12-31 Eric Blake + signal: work around Haiku issue with SIGBUS + * lib/siglist.h: Add comment. + * lib/sig2str.c (numname_table): Swap SIGBUS order, to match + strsignal's favoring of SIGSEGV. + * tests/test-signal.c (main): Avoid test failure. + * doc/posix-headers/signal.texi (signal.h): Document the issue. + Reported by Scott McCreary. + nl_langinfo: fix YESEXPR on Irix 6.5 * m4/nl_langinfo.m4 (gl_FUNC_NL_LANGINFO): Test for Irix bug. * lib/nl_langinfo.c (rpl_nl_langinfo): Work around it. diff --git a/doc/posix-headers/signal.texi b/doc/posix-headers/signal.texi index 9056d1e3e..77a54323c 100644 --- a/doc/posix-headers/signal.texi +++ b/doc/posix-headers/signal.texi @@ -39,4 +39,8 @@ mingw. The macros @code{SIGRTMIN} and @code{SIGRTMAX} expand to an expression of type @code{long} instead of @code{int} on some platforms: OSF/1 5.1. +@item +The macro @code{SIGBUS} is set to the same value as @code{SIGSEGV}, +rather than being a distinct signal, on some platforms: +Haiku. @end itemize diff --git a/lib/sig2str.c b/lib/sig2str.c index 770f88c00..70faa66c3 100644 --- a/lib/sig2str.c +++ b/lib/sig2str.c @@ -41,7 +41,7 @@ static struct numname { int num; char const name[8]; } numname_table[] = { /* Signals required by POSIX 1003.1-2001 base, listed in - traditional numeric order. */ + traditional numeric order where possible. */ #ifdef SIGHUP NUMNAME (HUP), #endif @@ -66,12 +66,14 @@ static struct numname { int num; char const name[8]; } numname_table[] = #ifdef SIGKILL NUMNAME (KILL), #endif -#ifdef SIGBUS - NUMNAME (BUS), -#endif #ifdef SIGSEGV NUMNAME (SEGV), #endif + /* On Haiku, SIGSEGV == SIGBUS, but we prefer SIGSEGV to match + strsignal.c output, so SIGBUS must be listed second. */ +#ifdef SIGBUS + NUMNAME (BUS), +#endif #ifdef SIGPIPE NUMNAME (PIPE), #endif diff --git a/lib/siglist.h b/lib/siglist.h index 8c86d9b22..104bc6831 100644 --- a/lib/siglist.h +++ b/lib/siglist.h @@ -23,6 +23,9 @@ /* This file is included multiple times. */ +/* Duplicate values (such as SIGBUS==SIGSEGV on Haiku) favor the last + list entry. */ + /* Standard signals */ #ifdef SIGHUP init_sig (SIGHUP, "HUP", N_("Hangup")) diff --git a/tests/test-signal.c b/tests/test-signal.c index 116fe0527..7103e1ff1 100644 --- a/tests/test-signal.c +++ b/tests/test-signal.c @@ -59,7 +59,8 @@ main (void) #ifdef SIGALRM case SIGALRM: #endif -#ifdef SIGBUS + /* On Haiku, SIGBUS is mistakenly equal to SIGSEGV. */ +#if defined SIGBUS && SIGBUS != SIGSEGV case SIGBUS: #endif #ifdef SIGCHLD -- 2.11.0