FFstrbuf: fix bug of AppendF when string len == ffStrbufGetFree

This commit is contained in:
李通洲
2022-12-02 22:20:01 +08:00
parent 2a8235ae38
commit 8b0d034a94
2 changed files with 34 additions and 17 deletions
+7 -10
View File
@@ -138,21 +138,18 @@ void ffStrbufAppendVF(FFstrbuf* strbuf, const char* format, va_list arguments)
va_copy(copy, arguments);
uint32_t free = ffStrbufGetFree(strbuf);
uint32_t written = (uint32_t) vsnprintf(strbuf->chars + strbuf->length, free, format, arguments);
int written = vsnprintf(strbuf->chars + strbuf->length, strbuf->allocated > 0 ? free + 1 : 0, format, arguments);
if(strbuf->length + written > free)
if(written > 0 && strbuf->length + (uint32_t) written > free)
{
ffStrbufEnsureFree(strbuf, written);
written = (uint32_t) vsnprintf(strbuf->chars + strbuf->length, ffStrbufGetFree(strbuf), format, copy);
ffStrbufEnsureFree(strbuf, (uint32_t) written);
written = vsnprintf(strbuf->chars + strbuf->length, (uint32_t) written + 1, format, copy);
}
va_end(copy);
if(written == 0)
return;
strbuf->length += written;
strbuf->chars[strbuf->length] = '\0';
if(written > 0)
strbuf->length += (uint32_t) written;
}
void ffStrbufAppendSUntilC(FFstrbuf* strbuf, const char* value, char until)
@@ -438,5 +435,5 @@ void ffStrbufDestroy(FFstrbuf* strbuf)
//Avoid free-after-use. These 3 assignments are cheap so don't remove them
strbuf->allocated = strbuf->length = 0;
free(strbuf->chars);
strbuf->chars = NULL;
strbuf->chars = CHAR_NULL_PTR;
}