Hi,

We have had some discussions lately about a loop in assoc_find, and since we currently haven't been able to reproduce this problem in our test environment I think that we should add loop detection into the assoc_find routine.

The following is a patch (for the binary branch) that implements this.

Trond

Index: assoc.c
===================================================================
--- assoc.c     (revision 778)
+++ assoc.c     (working copy)
@@ -489,7 +489,10 @@
     uint32_t hv = hash(key, nkey, 0);
     item *it;
     unsigned int oldbucket;
-
+#ifndef NDEBUG
+    item *lookahead;
+#endif
+
     if (expanding &&
         (oldbucket = (hv & hashmask(hashpower - 1))) >= expand_bucket)
     {
@@ -498,7 +501,22 @@
         it = primary_hashtable[hv & hashmask(hashpower)];
     }

+#ifndef NDEBUG
+    lookahead = it;
+#endif
+
     while (it) {
+#ifndef NDEBUG
+        if (lookahead && lookahead->h_next) {
+            lookahead = lookahead->h_next->h_next;
+            if (lookahead == it) {
+                fprintf(stderr,
+ "ERROR: Loop detected inside the assoc table! %s\n", + expanding ? " during expansion of the hashtable" : "");
+                assert(false);
+            }
+        }
+#endif
         if ((nkey == it->nkey) &&
             (memcmp(key, ITEM_key(it), nkey) == 0)) {
             return it;

Reply via email to