From: Michael Clark Date: Thu, 27 Aug 2009 06:40:00 +0000 (+0000) Subject: * Fix subtle bug in linkhash where lookup could hang after all slots X-Git-Tag: json-c-0.10-20120530~65 X-Git-Url: http://git.ipfire.org/gitweb/gitweb.cgi?a=commitdiff_plain;h=f5dd43a9d10abb2de50956d23505da08896f0c64;p=thirdparty%2Fjson-c.git * 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 git-svn-id: http://svn.metaparadigm.com/svn/json-c/trunk@54 327403b1-1117-474d-bef2-5cb71233fd97 --- diff --git a/ChangeLog b/ChangeLog index a99c7edd..2011cc2e 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 998cf7d1..3a9ba0e0 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; }