hash: once again explicitly disallow insertion of NULL
authorJim Meyering <meyering@redhat.com>
Sun, 4 Jul 2010 08:54:38 +0000 (10:54 +0200)
committerJim Meyering <meyering@redhat.com>
Sun, 4 Jul 2010 09:00:59 +0000 (11:00 +0200)
* lib/hash.c (hash_insert0): Reinstate just-removed test:
inserting a NULL pointer cannot work with these functions.
Add a comment with details.
This reverts part of the 2010-07-01 commit, 5bef1a35
"hash: extend module to deal with non-pointer keys".

ChangeLog
lib/hash.c

index 61d0f53c3d7d0b47cb931f180cc1172fc19f2d14..f64cc8ec80ac1dbb4283b9545c3419bef1d4f7be 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2010-07-04  Jim Meyering  <meyering@redhat.com>
+
+       hash: once again explicitly disallow insertion of NULL
+       * lib/hash.c (hash_insert0): Reinstate just-removed test:
+       inserting a NULL pointer cannot work with these functions.
+       Add a comment with details.
+       This reverts part of the 2010-07-01 commit, 5bef1a35
+       "hash: extend module to deal with non-pointer keys".
+
 2010-07-01  Bruno Haible  <bruno@clisp.org>
 
        stdbool: Update doc.
index 4c359a472130a704f8eab25ae5105b7828cf2a4f..15630be21ed8569525fe17bd04e93457d960fd73 100644 (file)
@@ -1032,13 +1032,20 @@ hash_rehash (Hash_table *table, size_t candidate)
    hash_insert, the only way to distinguish those cases is to compare
    the return value and ENTRY.  That works only when you can have two
    different ENTRY values that point to data that compares "equal".  Thus,
-   when the ENTRY value is a simple scalar, you must use hash_insert0.  */
+   when the ENTRY value is a simple scalar, you must use hash_insert0.
+   ENTRY must not be NULL.  */
 int
 hash_insert0 (Hash_table *table, void const *entry, void const **matched_ent)
 {
   void *data;
   struct hash_entry *bucket;
 
+  /* The caller cannot insert a NULL entry, since hash_lookup returns NULL
+     to indicate "not found", and hash_find_entry uses "bucket->data == NULL"
+     to indicate an empty bucket.  */
+  if (! entry)
+    abort ();
+
   /* If there's a matching entry already in the table, return that.  */
   if ((data = hash_find_entry (table, entry, &bucket, false)) != NULL)
     {