Fix g_hash_table_foreach crash with NULL hash table
authorChristophe Fergeau <cfergeau@redhat.com>
Thu, 9 Feb 2012 16:59:55 +0000 (17:59 +0100)
committerChristophe Fergeau <cfergeau@redhat.com>
Fri, 10 Feb 2012 09:03:38 +0000 (10:03 +0100)
When G_DISABLE_ASSERT is not defined, g_hash_table_foreach and
g_hash_table_find dereferences the hash table argument before
checking if it's NULL. This causes a crash when one of this function
is mistakenly called with a NULL argument instead of returning
with a warning through g_return_if_fail.

glib/ghash.c

index b058d17..e204a40 100644 (file)
@@ -1504,12 +1504,16 @@ g_hash_table_foreach (GHashTable *hash_table,
 {
   gint i;
 #ifndef G_DISABLE_ASSERT
-  gint version = hash_table->version;
+  gint version;
 #endif
 
   g_return_if_fail (hash_table != NULL);
   g_return_if_fail (func != NULL);
 
+#ifndef G_DISABLE_ASSERT
+  version = hash_table->version;
+#endif
+
   for (i = 0; i < hash_table->size; i++)
     {
       guint node_hash = hash_table->hashes[i];
@@ -1558,13 +1562,17 @@ g_hash_table_find (GHashTable *hash_table,
 {
   gint i;
 #ifndef G_DISABLE_ASSERT
-  gint version = hash_table->version;
+  gint version;
 #endif
   gboolean match;
 
   g_return_val_if_fail (hash_table != NULL, NULL);
   g_return_val_if_fail (predicate != NULL, NULL);
 
+#ifndef G_DISABLE_ASSERT
+  version = hash_table->version;
+#endif
+
   match = FALSE;
 
   for (i = 0; i < hash_table->size; i++)