# HG changeset patch # User Jim Meyering # Date 1004775834 0 # Node ID abe625b0449a0685f5962ee07b3c3bb59e886e58 # Parent 68530c9df63a8108199ec29a2d18e952c841e80d (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. diff --git a/lib/hash.c b/lib/hash.c --- 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;