X-Git-Url: https://git.tokkee.org/?p=sysdb.git;a=blobdiff_plain;f=src%2Futils%2Fstrbuf.c;h=a48f7bc5765959d38050bdf2f19c027a9765f789;hp=df3ee4b236d7f41b716cec4ca6edb1f090086286;hb=6f6e12a94487f7bdf9efe2d5f1733684df6d75a6;hpb=bcf49768cccf7b536d6c4c741afce40b817b3309 diff --git a/src/utils/strbuf.c b/src/utils/strbuf.c index df3ee4b..a48f7bc 100644 --- a/src/utils/strbuf.c +++ b/src/utils/strbuf.c @@ -105,6 +105,7 @@ sdb_strbuf_destroy(sdb_strbuf_t *strbuf) ssize_t sdb_strbuf_vappend(sdb_strbuf_t *strbuf, const char *fmt, va_list ap) { + va_list aq; int status; if ((! strbuf) || (! fmt)) @@ -116,21 +117,27 @@ sdb_strbuf_vappend(sdb_strbuf_t *strbuf, const char *fmt, va_list ap) if (strbuf_resize(strbuf)) return -1; + /* 'ap' is invalid after calling vsnprintf; thus copy before using it */ + va_copy(aq, ap); status = vsnprintf(strbuf->string + strbuf->pos, strbuf->size - strbuf->pos, fmt, ap); - if (status < 0) + if (status < 0) { + va_end(aq); return status; + } if ((size_t)status >= strbuf->size - strbuf->pos) { strbuf_resize(strbuf); /* reset string and try again */ strbuf->string[strbuf->pos] = '\0'; - return sdb_strbuf_vappend(strbuf, fmt, ap); + status = (int)sdb_strbuf_vappend(strbuf, fmt, aq); } + else + strbuf->pos += (size_t)status; - strbuf->pos += (size_t)status; + va_end(aq); return (ssize_t)status; } /* sdb_strbuf_vappend */