diff --git a/ChangeLog b/ChangeLog index a99c7edd93..2011cc2eac 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +0.10 + * Fix subtle bug in linkhash where lookup could hang after all slots + were filled then successively freed. + Spotted by Jean-Marc Naud, j dash m at newtraxtech dot com + * Make json_object_from_file take const char *filename + Spotted by Vikram Raj V, vsagar at attinteractive dot com * Add handling of surrogate pairs (json_tokener.c, test4.c, Makefile.am) Brent Miller, bdmiller at yahoo dash inc dot com * Correction to comment describing printbuf_memappend in printbuf.h diff --git a/linkhash.c b/linkhash.c index 998cf7d1cc..3a9ba0e08f 100644 --- a/linkhash.c +++ b/linkhash.c @@ -158,13 +158,15 @@ struct lh_entry* lh_table_lookup_entry(struct lh_table *t, const void *k) { unsigned long h = t->hash_fn(k); unsigned long n = h % t->size; + int count = 0; t->lookups++; - while( 1 ) { + while( count < t->size ) { if(t->table[n].k == LH_EMPTY) return NULL; if(t->table[n].k != LH_FREED && t->equal_fn(t->table[n].k, k)) return &t->table[n]; if(++n == t->size) n = 0; + count++; } return NULL; }