diff --git a/src/interpret_functions.h b/src/interpret_functions.h
index 4e95b499a983f04dcc568ea021b37c59a4cab5e3..da057375cde149ea4ca8d8a5351402539d4abc1d 100644
--- a/src/interpret_functions.h
+++ b/src/interpret_functions.h
@@ -527,9 +527,15 @@ OPCODE2(F_ADD_LOCALS_AND_POP, "local += local", 0,
       if( dsts->len && srcs->len )
       {
           size_t tmp = dsts->len;
+          size_t tmp2 = srcs->len;
+          /*
+           * in case srcs==dsts
+           *  pike_string_cpy(MKPCHARP_STR_OFF(dsts,tmp), srcs);
+           * does bad stuff
+           */
           dsts = new_realloc_shared_string( dsts, tmp+srcs->len, MAX(srcs->size_shift,dsts->size_shift) );
           update_flags_for_add( dsts, srcs );
-          pike_string_cpy(MKPCHARP_STR_OFF(dsts,tmp), srcs);
+          generic_memcpy(MKPCHARP_STR_OFF(dsts,tmp), MKPCHARP_STR(srcs), tmp2);
           dst->u.string = low_end_shared_string( dsts );
       }
       else if( !dsts->len )