From 1fbbfdad1fd2338a5323a8b18119c0eb4c00aee1 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Henrik=20Grubbstr=C3=B6m=20=28Grubba=29?=
 <grubba@grubba.org>
Date: Sun, 4 Sep 2011 16:30:41 +0200
Subject: [PATCH] Mappings: rehash() now forces a new mapping_data. Fixes [bug
 6062].

The actual bug seems to be old, but gets triggered by the new hashtable sizes.
---
 src/mapping.c | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/src/mapping.c b/src/mapping.c
index 471fa0bf9c..168d835bc8 100644
--- a/src/mapping.c
+++ b/src/mapping.c
@@ -427,7 +427,10 @@ static struct mapping *rehash(struct mapping *m, int new_size)
   if(d_flag>1)  check_mapping(m);
 #endif
 
-  if (md->hashsize == new_size) return m;
+  /* FIXME: The special case below seems suspect.
+   *	/grubba 2011-09-04
+   */
+  if ((md->hashsize == new_size) && (md->refs == 1)) return m;
 
   init_mapping(m, new_size, md->flags);
   debug_malloc_touch(m);
@@ -2355,6 +2358,9 @@ void check_mapping(const struct mapping *m)
   if(md->size > md->num_keypairs)
     Pike_fatal("Pretty mean hashtable there buster!\n");
 
+  if(md->hashsize & (md->hashsize - 1))
+    Pike_fatal("Invalid hashtable size: 0x%08lx\n", (long)md->hashsize);
+
   if(md->hashsize > md->num_keypairs)
     Pike_fatal("Pretty mean hashtable there buster %d > %d (2)!\n",md->hashsize,md->num_keypairs);
 
-- 
GitLab