X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Ffatal-signal.c;h=5157d7c540f3c5bf235bfd12b3c2fa4916795741;hb=6cad9c91215eac0f90bbb1f9473ea0f5fce3b085;hp=5bd757258d1df2c4bc9f127b227e370cf32ba594;hpb=222b0486b7db1b09293e05512873d633440efcb3;p=gnulib.git diff --git a/lib/fatal-signal.c b/lib/fatal-signal.c index 5bd757258..5157d7c54 100644 --- a/lib/fatal-signal.c +++ b/lib/fatal-signal.c @@ -1,11 +1,11 @@ /* Emergency actions in case of a fatal signal. - Copyright (C) 2003-2004 Free Software Foundation, Inc. + Copyright (C) 2003-2004, 2006-2007 Free Software Foundation, Inc. Written by Bruno Haible , 2003. - This program is free software; you can redistribute it and/or modify + This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -13,13 +13,10 @@ GNU General Public License for more details. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + along with this program. If not, see . */ -#ifdef HAVE_CONFIG_H -# include -#endif +#include /* Specification. */ #include "fatal-signal.h" @@ -27,10 +24,7 @@ #include #include #include -#include -#if HAVE_UNISTD_H -# include -#endif +#include #include "xalloc.h" @@ -77,6 +71,10 @@ static int fatal_signals[] = #ifdef SIGXFSZ SIGXFSZ, #endif + /* Woe32 signals. */ +#ifdef SIGBREAK + SIGBREAK, +#endif 0 }; @@ -203,12 +201,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)); - - memcpy (new_actions, old_actions, - actions_allocated * sizeof (actions_entry_t)); + XNMALLOC (new_actions_allocated, actions_entry_t); + size_t k; + + /* 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. */ @@ -227,8 +230,6 @@ at_fatal_signal (action_t action) /* ========================================================================= */ -#if HAVE_POSIX_SIGNALBLOCKING - static sigset_t fatal_signal_set; static void @@ -265,20 +266,3 @@ unblock_fatal_signals () init_fatal_signal_set (); sigprocmask (SIG_UNBLOCK, &fatal_signal_set, NULL); } - -#else - -/* Don't bother caring about the old systems which don't have POSIX signal - blocking. */ - -void -block_fatal_signals () -{ -} - -void -unblock_fatal_signals () -{ -} - -#endif