X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Ffatal-signal.c;h=8a3a99c3689d1ad16135a0b86cccf1e0f888018d;hb=9779c75032dc76d2a77177bb0bfd66243ec57673;hp=ebba498e991db483147bbb1748a26395489f17f8;hpb=e2ea3424e558c3c18e26a18c54f55d43bfa18e38;p=gnulib.git diff --git a/lib/fatal-signal.c b/lib/fatal-signal.c index ebba498e9..8a3a99c36 100644 --- a/lib/fatal-signal.c +++ b/lib/fatal-signal.c @@ -1,5 +1,5 @@ /* Emergency actions in case of a fatal signal. - Copyright (C) 2003-2004 Free Software Foundation, Inc. + Copyright (C) 2003-2004, 2006 Free Software Foundation, Inc. Written by Bruno Haible , 2003. This program is free software; you can redistribute it and/or modify @@ -14,12 +14,10 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif +#include /* Specification. */ #include "fatal-signal.h" @@ -27,10 +25,7 @@ #include #include #include -#include -#if HAVE_UNISTD_H -# include -#endif +#include #include "xalloc.h" @@ -77,6 +72,10 @@ static int fatal_signals[] = #ifdef SIGXFSZ SIGXFSZ, #endif + /* Woe32 signals. */ +#ifdef SIGBREAK + SIGBREAK, +#endif 0 }; @@ -90,6 +89,7 @@ init_fatal_signals (void) static bool fatal_signals_initialized = false; if (!fatal_signals_initialized) { +#if HAVE_SIGACTION size_t i; for (i = 0; i < num_fatal_signals; i++) @@ -100,6 +100,7 @@ init_fatal_signals (void) && action.sa_handler == SIG_IGN) fatal_signals[i] = -1; } +#endif fatal_signals_initialized = true; } @@ -201,12 +202,17 @@ at_fatal_signal (action_t action) because then the cleanup() function could access an already deallocated array. */ actions_entry_t *old_actions = actions; + size_t old_actions_allocated = actions_allocated; size_t new_actions_allocated = 2 * actions_allocated; actions_entry_t *new_actions = xmalloc (new_actions_allocated * sizeof (actions_entry_t)); + size_t k; - memcpy (new_actions, old_actions, - actions_allocated * sizeof (actions_entry_t)); + /* Don't use memcpy() here, because memcpy takes non-volatile arguments + and is therefore not guaranteed to complete all memory stores before + the next statement. */ + for (k = 0; k < old_actions_allocated; k++) + new_actions[k] = old_actions[k]; actions = new_actions; actions_allocated = new_actions_allocated; /* Now we can free the old actions array. */