changeset 3582:abe625b0449a

(hash_clear): Fix a bug that could lead to an infloop or e.g., a fault due to an attempt to free a NULL pointer.
author Jim Meyering <jim@meyering.net>
date Sat, 03 Nov 2001 08:23:54 +0000
parents 68530c9df63a
children acb4987bbdfa
files lib/hash.c
diffstat 1 files changed, 6 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/lib/hash.c
+++ b/lib/hash.c
@@ -1,5 +1,5 @@
 /* hash - hashing table processing.
-   Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc.
+   Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
    Written by Jim Meyering, 1992.
 
    This program is free software; you can redistribute it and/or modify
@@ -576,19 +576,22 @@
 hash_clear (Hash_table *table)
 {
   struct hash_entry *bucket;
-  struct hash_entry *cursor;
 
   for (bucket = table->bucket; bucket < table->bucket_limit; bucket++)
     {
       if (bucket->data)
 	{
+	  struct hash_entry *cursor;
+	  struct hash_entry *next;
+
 	  /* Free the bucket overflow.  */
-	  for (cursor = bucket->next; cursor; cursor = cursor->next)
+	  for (cursor = bucket->next; cursor; cursor = next)
 	    {
 	      if (table->data_freer)
 		(*table->data_freer) (cursor->data);
 	      cursor->data = NULL;
 
+	      next = cursor->next;
 	      /* Relinking is done one entry at a time, as it is to be expected
 		 that overflows are either rare or short.  */
 	      cursor->next = table->free_entry_list;