From a6306f090abcb1316a81444dc5514d236409349b Mon Sep 17 00:00:00 2001 From: Benny Baumann Date: Fri, 5 Apr 2024 23:17:17 +0200 Subject: [PATCH] Properly handle RichString_extendLen when an external buffer already exists --- RichString.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/RichString.c b/RichString.c index ea9048177..556674b0d 100644 --- a/RichString.c +++ b/RichString.c @@ -20,18 +20,26 @@ in the source distribution for its full text. #define charBytes(n) (sizeof(CharType) * (n)) static void RichString_extendLen(RichString* this, int len) { - if (this->chlen <= RICHSTRING_MAXLEN) { + if (this->chptr == this->chstr) { + // String is in internal buffer if (len > RICHSTRING_MAXLEN) { + // Copy from internal buffer to allocated string this->chptr = xMalloc(charBytes(len + 1)); memcpy(this->chptr, this->chstr, charBytes(this->chlen)); + } else { + // Still fits in internal buffer, do nothing + assert(this->chlen <= RICHSTRING_MAXLEN); } } else { - if (len <= RICHSTRING_MAXLEN) { + // String is managed externally + if (len > RICHSTRING_MAXLEN) { + // Just reallocate the buffer accordingly + this->chptr = xRealloc(this->chptr, charBytes(len + 1)); + } else { + // Move string into internal buffer and free resources memcpy(this->chstr, this->chptr, charBytes(len)); free(this->chptr); this->chptr = this->chstr; - } else { - this->chptr = xRealloc(this->chptr, charBytes(len + 1)); } }