From f37d8b3d6914b1f9637faf57175429443591e0ef Mon Sep 17 00:00:00 2001 From: dgp Date: Wed, 22 Jun 2016 17:38:31 +0000 Subject: [16896d49fd] Tcl_DStrings should tolerate appends to self. --- generic/tclUtil.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/generic/tclUtil.c b/generic/tclUtil.c index bc1490e..34d4be2 100644 --- a/generic/tclUtil.c +++ b/generic/tclUtil.c @@ -2431,8 +2431,20 @@ Tcl_DStringAppend( memcpy(newString, dsPtr->string, (size_t) dsPtr->length); dsPtr->string = newString; } else { + int offset = -1; + + /* See [16896d49fd] */ + if (bytes >= dsPtr->string + && bytes <= dsPtr->string + dsPtr->length) { + offset = bytes - dsPtr->string; + } + dsPtr->string = ckrealloc((void *) dsPtr->string, (size_t) dsPtr->spaceAvl); + + if (offset >= 0) { + bytes = dsPtr->string + offset; + } } } @@ -2495,8 +2507,20 @@ Tcl_DStringAppendElement( memcpy(newString, dsPtr->string, (size_t) dsPtr->length); dsPtr->string = newString; } else { + int offset = -1; + + /* See [16896d49fd] */ + if (element >= dsPtr->string + && element <= dsPtr->string + dsPtr->length) { + offset = element - dsPtr->string; + } + dsPtr->string = (char *) ckrealloc((void *) dsPtr->string, (size_t) dsPtr->spaceAvl); + + if (offset >= 0) { + element = dsPtr->string + offset; + } } dst = dsPtr->string + dsPtr->length; } -- cgit v0.12