]> git.ipfire.org Git - thirdparty/git.git/commitdiff
strbuf: fix leak when `appendwholeline()` fails with EOF
authorPatrick Steinhardt <ps@pks.im>
Mon, 27 May 2024 11:46:01 +0000 (13:46 +0200)
committerJunio C Hamano <gitster@pobox.com>
Mon, 27 May 2024 18:19:58 +0000 (11:19 -0700)
In `strbuf_appendwholeline()` we call `strbuf_getwholeline()` with a
temporary buffer. In case the call returns an error we indicate this by
returning EOF, but never release the temporary buffer. This can cause a
leak though because `strbuf_getwholeline()` calls getline(3). Quoting
its documentation:

    If *lineptr was set to NULL before the call, then the buffer
    should be freed by the user program even on failure.

Consequently, the temporary buffer may hold allocated memory even when
the call to `strbuf_getwholeline()` fails.

Fix this by releasing the temporary buffer on error.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
strbuf.c
t/t1400-update-ref.sh

index 0d929e4e195fa3db65257142e558938471e7c141..e1076c989172480ed26b849f47b9736160b245de 100644 (file)
--- a/strbuf.c
+++ b/strbuf.c
@@ -691,8 +691,10 @@ int strbuf_getwholeline(struct strbuf *sb, FILE *fp, int term)
 int strbuf_appendwholeline(struct strbuf *sb, FILE *fp, int term)
 {
        struct strbuf line = STRBUF_INIT;
-       if (strbuf_getwholeline(&line, fp, term))
+       if (strbuf_getwholeline(&line, fp, term)) {
+               strbuf_release(&line);
                return EOF;
+       }
        strbuf_addbuf(sb, &line);
        strbuf_release(&line);
        return 0;
index ec3443cc8786d126cbc0085de184b2e9af019566..bbee2783ab1afb4d0d0379d1f01de668d72b82f5 100755 (executable)
@@ -4,6 +4,8 @@
 #
 
 test_description='Test git update-ref and basic ref logging'
+
+TEST_PASSES_SANITIZE_LEAK=true
 . ./test-lib.sh
 
 Z=$ZERO_OID