m4-patches
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

hash table allocation failure


From: Eric Blake
Subject: hash table allocation failure
Date: Mon, 15 Jun 2009 21:25:28 -0600
User-agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.21) Gecko/20090302 Thunderbird/2.0.0.21 Mnenhy/0.7.6.666

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Thanks to Jim's recent work on the gnulib hash module, I audited the code
for cases where allocation failure could cause assertion failures instead
of expected xalloc_die behavior (either way, the program ends, but I want
it to be obvious from the stderr output that the user was short on memory,
and not that they triggered an internal error in m4).  I have a pending
patch that aims to clean up a memory leak in gnulib's hash_rehash
(admittedly a corner case, since there's not much you can do to recover
from an allocation failure on a rehash); but until that is reviewed and
applied, I'm using a gnulib local override to avoid a gcc warning.  Only
branch-1.6 is affected.

- --
Don't work too hard, make some time for fun as well!

Eric Blake             address@hidden
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (Cygwin)
Comment: Public key at home.comcast.net/~ericblake/eblake.gpg
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org

iEYEARECAAYFAko3EKgACgkQ84KuGfSFAYDvswCdEaAIsTgH5+wpq+GLfeJMhJVr
4AAAn0L/JxW1cOX/5/jGZAC6qmmN7nRS
=yIHW
-----END PGP SIGNATURE-----
>From 5165ce08a8784648f4fa0fafe2d3005569f16bdd Mon Sep 17 00:00:00 2001
From: Eric Blake <address@hidden>
Date: Mon, 15 Jun 2009 09:17:41 -0600
Subject: [PATCH] Properly manage hash return values.

* src/symtab.c (symtab_init, lookup_symbol): React to allocation
failure.
* local/lib/hash.c.diff: New file to silence gcc warning, until
such time as upstream gnulib hash module is patched to avoid
memory leak.
* .gitattributes: Ignore spacing in diff.

Signed-off-by: Eric Blake <address@hidden>
---
 .gitattributes        |    3 +++
 ChangeLog             |   10 ++++++++++
 local/lib/hash.c.diff |   27 +++++++++++++++++++++++++++
 src/symtab.c          |   17 ++++++++++++++---
 4 files changed, 54 insertions(+), 3 deletions(-)
 create mode 100644 local/lib/hash.c.diff

diff --git a/.gitattributes b/.gitattributes
index 68d2d12..1b29560 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -2,3 +2,6 @@
 # needed for using these attributes effectively.
 ChangeLog merge=merge-changelog
 *.texi* diff=texinfo
+# Ignore whitespace in any gnulib local patches.
+local/* -whitespace
+local/*/* -whitespace
diff --git a/ChangeLog b/ChangeLog
index 3b3ca90..c9169f4 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2009-06-15  Eric Blake  <address@hidden>
+
+       Properly manage hash return values.
+       * src/symtab.c (symtab_init, lookup_symbol): React to allocation
+       failure.
+       * local/lib/hash.c.diff: New file to silence gcc warning, until
+       such time as upstream gnulib hash module is patched to avoid
+       memory leak.
+       * .gitattributes: Ignore spacing in diff.
+
 2009-06-13  Eric Blake  <address@hidden>

        Fix testsuite failure.
diff --git a/local/lib/hash.c.diff b/local/lib/hash.c.diff
new file mode 100644
index 0000000..8d27a36
--- /dev/null
+++ b/local/lib/hash.c.diff
@@ -0,0 +1,27 @@
+diff --git a/lib/hash.c b/lib/hash.c
+index 7d76d45..6f3a5c6 100644
+--- a/lib/hash.c
++++ b/lib/hash.c
+@@ -1,7 +1,7 @@
+ /* hash - hashing table processing.
+
+-   Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2006, 2007 Free
+-   Software Foundation, Inc.
++   Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2006, 2007,
++   2009 Free Software Foundation, Inc.
+
+    Written by Jim Meyering, 1992.
+
+@@ -1012,7 +1012,11 @@ hash_delete (Hash_table *table, const void *entry)
+                : (table->n_buckets * tuning->shrink_factor
+                   * tuning->growth_threshold));
+
+-            hash_rehash (table, candidate);
++            if (hash_rehash (table, candidate))
++              {
++                /* Failure to allocate memory in an attempt to
++                   shrink the table is not fatal.  */
++              }
+           }
+       }
+     }
diff --git a/src/symtab.c b/src/symtab.c
index 6631e9c..338bf17 100644
--- a/src/symtab.c
+++ b/src/symtab.c
@@ -177,6 +177,8 @@ symtab_init (size_t size)
 {
   symtab = hash_initialize (size, NULL, symtab_hasher, symtab_comparator,
                            symtab_free_entry);
+  if (!symtab)
+    xalloc_die ();

 #ifdef DEBUG_SYM
   atexit (show_profile); /* Ignore failure, since this is debug code.  */
@@ -277,7 +279,10 @@ lookup_symbol (const char *name, size_t len, symbol_lookup 
mode)
                  assert (entry == old);
                  sym->stack = sym;
                  entry = (symbol *) hash_insert (symtab, sym);
-                 assert (sym == entry);
+                 if (entry)
+                   assert (sym == entry);
+                 else
+                   xalloc_die ();
                }
              else
                {
@@ -319,7 +324,10 @@ lookup_symbol (const char *name, size_t len, symbol_lookup 
mode)
        {
          sym->stack = sym;
          entry = (symbol *) hash_insert (symtab, sym);
-         assert (sym == entry);
+         if (entry)
+           assert (sym == entry);
+         else
+           xalloc_die ();
        }
       return sym;

@@ -376,7 +384,10 @@ lookup_symbol (const char *name, size_t len, symbol_lookup 
mode)

            sym->stack = sym;
            entry = (symbol *) hash_insert (symtab, sym);
-           assert (sym == entry);
+           if (entry)
+             assert (sym == entry);
+           else
+             xalloc_die ();
          }
        return result;
       }
-- 
1.6.3.rc3.2.g4b51


reply via email to

[Prev in Thread] Current Thread [Next in Thread]