strbuf: release memory on read error in strbuf_read_once()
authorRené Scharfe <l.s.r@web.de>
Thu, 7 Dec 2017 20:51:26 +0000 (21:51 +0100)
committerJunio C Hamano <gitster@pobox.com>
Thu, 7 Dec 2017 21:19:23 +0000 (13:19 -0800)
If other strbuf add functions cause the first allocation and
subsequently encounter an error then they release the memory, restoring
the pristine state of the strbuf. That simplifies error handling for
callers.

Do the same in strbuf_read_once(), and do it also in case no bytes were
read -- which may or may not be an error as well, depending on the
caller.

Signed-off-by: Rene Scharfe <l.s.r@web.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
strbuf.c
index ace58e7367300975e118660ed2004c7d0885481c..0809bca2562a4c970e0405b69de3ed095f3c6e26 100644 (file)
--- a/strbuf.c
+++ b/strbuf.c
@@ -393,12 +393,15 @@ ssize_t strbuf_read(struct strbuf *sb, int fd, size_t hint)
 
 ssize_t strbuf_read_once(struct strbuf *sb, int fd, size_t hint)
 {
+       size_t oldalloc = sb->alloc;
        ssize_t cnt;
 
        strbuf_grow(sb, hint ? hint : 8192);
        cnt = xread(fd, sb->buf + sb->len, sb->alloc - sb->len - 1);
        if (cnt > 0)
                strbuf_setlen(sb, sb->len + cnt);
+       else if (oldalloc == 0)
+               strbuf_release(sb);
        return cnt;
 }