]> git.ipfire.org Git - thirdparty/git.git/commitdiff
http-push: free transfer_request strbuf
authorJeff King <peff@peff.net>
Tue, 24 Sep 2024 22:08:49 +0000 (18:08 -0400)
committerJunio C Hamano <gitster@pobox.com>
Wed, 25 Sep 2024 17:24:57 +0000 (10:24 -0700)
When we issue a PUT, we initialize and fill a strbuf embedded in the
transfer_request struct. But we never release this buffer, causing a
leak.

We can fix this by adding a strbuf_release() call to release_request().
If we stopped there, then non-PUT requests would try to release a
zero-initialized strbuf. This works OK in practice, but we should try to
follow the strbuf API more closely. So instead, we'll always initialize
the strbuf when we create the transfer_request struct.

That in turn means switching the strbuf_init() call in start_put() to a
simple strbuf_grow().

This leak is triggered in t5540.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
http-push.c

index 9aa4d11ccd9eda6c6da6ae0a592333e8b99e89b1..8acdb3f2657d88aa93daa24a1d542a4683964246 100644 (file)
@@ -375,7 +375,7 @@ static void start_put(struct transfer_request *request)
        /* Set it up */
        git_deflate_init(&stream, zlib_compression_level);
        size = git_deflate_bound(&stream, len + hdrlen);
-       strbuf_init(&request->buffer.buf, size);
+       strbuf_grow(&request->buffer.buf, size);
        request->buffer.posn = 0;
 
        /* Compress it */
@@ -515,6 +515,7 @@ static void release_request(struct transfer_request *request)
 
        free(request->url);
        free(request->dest);
+       strbuf_release(&request->buffer.buf);
        free(request);
 }
 
@@ -655,6 +656,7 @@ static void add_fetch_request(struct object *obj)
        CALLOC_ARRAY(request, 1);
        request->obj = obj;
        request->state = NEED_FETCH;
+       strbuf_init(&request->buffer.buf, 0);
        request->next = request_queue_head;
        request_queue_head = request;
 
@@ -689,6 +691,7 @@ static int add_send_request(struct object *obj, struct remote_lock *lock)
        request->obj = obj;
        request->lock = lock;
        request->state = NEED_PUSH;
+       strbuf_init(&request->buffer.buf, 0);
        request->next = request_queue_head;
        request_queue_head = request;