]> git.ipfire.org Git - thirdparty/gettext.git/commitdiff
Fix possible problem with missing 'volatile'.
authorBruno Haible <bruno@clisp.org>
Mon, 10 Apr 2006 16:11:39 +0000 (16:11 +0000)
committerBruno Haible <bruno@clisp.org>
Tue, 23 Jun 2009 10:13:09 +0000 (12:13 +0200)
gettext-tools/lib/ChangeLog
gettext-tools/lib/fatal-signal.c

index 4bec7c1d3f328cd81d9e7500623895388719cb5e..d9a64d6b3955b49952d0c8c995e084f367c5c4cf 100644 (file)
@@ -1,3 +1,8 @@
+2006-04-09  Bruno Haible  <bruno@clisp.org>
+
+       * fatal-signal.c: Don't include string.h.
+       (at_fatal_signal): Use a copying loop instead of memcpy.
+
 2006-04-05  Bruno Haible  <bruno@clisp.org>
 
        * config.charset: Update Juan Manuel Guerrero's address.
index 3f07294488263e45cf582e5b8a7604907d9e0b89..5e245982ec2a4e073cb6bab15fc81ea31ed54285 100644 (file)
@@ -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 <bruno@clisp.org>, 2003.
 
    This program is free software; you can redistribute it and/or modify
@@ -27,7 +27,6 @@
 #include <stdbool.h>
 #include <stdlib.h>
 #include <signal.h>
-#include <string.h>
 #if HAVE_UNISTD_H
 # include <unistd.h>
 #endif
@@ -203,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.  */