diff --git a/src/stralloc.c b/src/stralloc.c
index 2a4f3f39c844c87e96df5f5992a19c28cec1f856..1cf8bd7ad8a61179ddd8fbdb32e4642af002b0f3 100644
--- a/src/stralloc.c
+++ b/src/stralloc.c
@@ -2,7 +2,7 @@
 || This file is part of Pike. For copyright information see COPYRIGHT.
 || Pike is distributed under GPL, LGPL and MPL. See the file COPYING
 || for more information.
-|| $Id: stralloc.c,v 1.221 2008/06/23 16:05:02 mast Exp $
+|| $Id: stralloc.c,v 1.222 2008/06/23 18:56:08 mast Exp $
 */
 
 #include "global.h"
@@ -769,6 +769,31 @@ PMOD_EXPORT struct pike_string *low_end_shared_string(struct pike_string *s)
   size_t h=0;
   struct pike_string *s2;
 
+#ifdef PIKE_DEBUG
+  if (d_flag) {
+    switch (s->size_shift) {
+      case 0:
+	break;
+
+      case 1:
+	if(!find_magnitude1(STR1(s),s->len))
+	  Pike_fatal ("String %p that should have shift 1 really got 0.\n", s);
+	break;
+
+      case 2: {
+	int m = find_magnitude2 (STR2 (s), s->len);
+	if (m != 2)
+	  Pike_fatal ("String %p that should have shift 2 really got %d.\n",
+		      s, m);
+	break;
+      }
+
+      default:
+	Pike_fatal("ARGHEL! size_shift:%d\n", s->size_shift);
+    }
+  }
+#endif
+
   len = s->len;
   if (s->flags & STRING_NOT_HASHED) {
     h = s->hval = do_hash(s);
@@ -803,12 +828,12 @@ PMOD_EXPORT struct pike_string *end_shared_string(struct pike_string *s)
 
   switch(s->size_shift)
   {
-#ifdef PIKE_DEBUG
     default:
+#ifdef PIKE_DEBUG
       Pike_fatal("ARGHEL! size_shift:%d\n", s->size_shift);
-#endif
 
     case 2:
+#endif
       switch(find_magnitude2(STR2(s),s->len))
       {
 	case 0:
@@ -2201,7 +2226,7 @@ PMOD_EXPORT void init_string_builder(struct string_builder *s, int mag)
   s->malloced=256;
   s->s=begin_wide_shared_string(256,mag);
   s->s->len=0;
-  s->s->str[0] = 0;
+  low_set_index (s->s, 0, 0);
   s->known_shift=0;
 }
 
@@ -2210,7 +2235,7 @@ PMOD_EXPORT void init_string_builder_alloc(struct string_builder *s, ptrdiff_t l
   s->malloced=length;
   s->s=begin_wide_shared_string(length,mag);
   s->s->len=0;
-  s->s->str[0] = 0;
+  low_set_index (s->s, 0, 0);
   s->known_shift=0;
 }
 
@@ -2218,8 +2243,9 @@ PMOD_EXPORT void init_string_builder_copy(struct string_builder *to,
 					  struct string_builder *from)
 {
   to->malloced = from->malloced;
-  to->s = begin_wide_shared_string (from->s->len, from->s->size_shift);
-  MEMCPY (to->s->str, from->s->str, from->s->len << from->s->size_shift);
+  to->s = begin_wide_shared_string (from->malloced, from->s->size_shift);
+  to->s->len = from->s->len;
+  MEMCPY (to->s->str, from->s->str, (from->s->len + 1) << from->s->size_shift);
   to->known_shift = from->known_shift;
 }
 
@@ -2997,7 +3023,7 @@ PMOD_EXPORT void reset_string_builder(struct string_builder *s)
   s->known_shift=0;
   s->s->len=0;
   /* Ensure NUL-termination */
-  s->s->str[0] = 0;
+  low_set_index (s->s, 0, 0);
 }
 
 PMOD_EXPORT void free_string_builder(struct string_builder *s)