diff options
| -rw-r--r-- | lib/typesafe.h | 9 | ||||
| -rw-r--r-- | tests/lib/test_typelist.h | 2 |
2 files changed, 7 insertions, 4 deletions
diff --git a/lib/typesafe.h b/lib/typesafe.h index 50c410ad24..8aeabb34e6 100644 --- a/lib/typesafe.h +++ b/lib/typesafe.h @@ -850,9 +850,12 @@ macro_inline type *prefix ## _add(struct prefix##_head *h, type *item) \ struct thash_item **np = &h->hh.entries[hbits]; \ while (*np && (*np)->hashval < hval) \ np = &(*np)->next; \ - if (*np && cmpfn(container_of(*np, type, field.hi), item) == 0) { \ - h->hh.count--; \ - return container_of(*np, type, field.hi); \ + while (*np && (*np)->hashval == hval) { \ + if (cmpfn(container_of(*np, type, field.hi), item) == 0) { \ + h->hh.count--; \ + return container_of(*np, type, field.hi); \ + } \ + np = &(*np)->next; \ } \ item->field.hi.next = *np; \ *np = &item->field.hi; \ diff --git a/tests/lib/test_typelist.h b/tests/lib/test_typelist.h index e3579c67a2..feb42909a8 100644 --- a/tests/lib/test_typelist.h +++ b/tests/lib/test_typelist.h @@ -74,7 +74,7 @@ static uint32_t list_hash(const struct item *a) { #ifdef SHITTY_HASH /* crappy hash to get some hash collisions */ - return a->val ^ (a->val << 29) ^ 0x55AA0000U; + return (a->val & 0xFF) ^ (a->val << 29) ^ 0x55AA0000U; #else return jhash_1word(a->val, 0xdeadbeef); #endif |
