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 )