diff --git a/src/utils/strbuf.c b/src/utils/strbuf.c
index 2b64480c55fc5960c816f83ef3a6b3bf626c1faf..77d19f044d71a1fec89ec629877d0deda5b3585d 100644 (file)
--- a/src/utils/strbuf.c
+++ b/src/utils/strbuf.c
assert((strbuf->size == 0) || (strbuf->string[strbuf->pos] == '\0'));
- if (strbuf->pos >= strbuf->size)
+ if (! strbuf->size) {
/* use some arbitrary but somewhat reasonable default */
- if (strbuf_resize(strbuf, strbuf->size ? 2 * strbuf->size : 64))
+ if (strbuf_resize(strbuf, 64))
+ return -1;
+ }
+ /* make sure to reserve space for the nul-byte */
+ else if (strbuf->pos >= strbuf->size - 1)
+ if (strbuf_resize(strbuf, 2 * strbuf->size))
return -1;
assert(strbuf->size && strbuf->string);
return status;
}
- if ((size_t)status >= strbuf->size - strbuf->pos) {
- strbuf_resize(strbuf, (size_t)status + 1);
+ /* 'status' does not include nul-byte */
+ if ((size_t)status >= strbuf->size - strbuf->pos - 1) {
+ if (strbuf_resize(strbuf, strbuf->size + (size_t)status)) {
+ va_end(aq);
+ return -1;
+ }
/* reset string and try again */
strbuf->string[strbuf->pos] = '\0';
ssize_t
sdb_strbuf_read(sdb_strbuf_t *strbuf, int fd, size_t n)
{
+ ssize_t ret;
+
if (! strbuf)
return -1;
if (strbuf_resize(strbuf, strbuf->pos + n + 1))
return -1;
- return read(fd, strbuf->string + strbuf->pos, n);
+ ret = read(fd, strbuf->string + strbuf->pos, n);
+ if (ret > 0)
+ strbuf->pos += (size_t)ret;
+ return ret;
} /* sdb_strbuf_read */
ssize_t