]> granicus.if.org Git - cgit/commitdiff
cgit_print_tree(): Free curr_rev after usage
authorLukas Fleischer <cgit@cryptocrack.de>
Mon, 4 Mar 2013 12:25:36 +0000 (13:25 +0100)
committerJason A. Donenfeld <Jason@zx2c4.com>
Tue, 5 Mar 2013 01:47:53 +0000 (20:47 -0500)
Fixes following memory leak seen with "PATH_INFO=/cgit/tree/":

    ==15715== 7 bytes in 1 blocks are definitely lost in loss record 4 of 51
    ==15715==    at 0x4C2C04B: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
    ==15715==    by 0x56F2DF1: strdup (in /usr/lib/libc-2.17.so)
    ==15715==    by 0x46CAA8: xstrdup (wrapper.c:35)
    ==15715==    by 0x418A4C: cgit_print_tree (ui-tree.c:274)
    ==15715==    by 0x407D91: tree_fn (cmd.c:131)
    ==15715==    by 0x405E16: process_request (cgit.c:574)
    ==15715==    by 0x4074C8: cache_process (cache.c:322)
    ==15715==    by 0x406C4F: main (cgit.c:872)

Signed-off-by: Lukas Fleischer <cgit@cryptocrack.de>
ui-tree.c

index 561f9e7c7a0a80a6a222e0aa12fe2e6aed59ad3e..b692b563a850421dd30fc24dc6174f0ed81d3363 100644 (file)
--- a/ui-tree.c
+++ b/ui-tree.c
@@ -271,7 +271,6 @@ void cgit_print_tree(const char *rev, char *path)
        if (!rev)
                rev = ctx.qry.head;
 
-       walk_tree_ctx.curr_rev = xstrdup(rev);
        if (get_sha1(rev, sha1)) {
                cgit_print_error(fmt("Invalid revision name: %s", rev));
                return;
@@ -282,12 +281,17 @@ void cgit_print_tree(const char *rev, char *path)
                return;
        }
 
+       walk_tree_ctx.curr_rev = xstrdup(rev);
+
        if (path == NULL) {
                ls_tree(commit->tree->object.sha1, NULL, &walk_tree_ctx);
-               return;
+               goto cleanup;
        }
 
        read_tree_recursive(commit->tree, "", 0, 0, &paths, walk_tree, &walk_tree_ctx);
        if (walk_tree_ctx.state == 1)
                ls_tail();
+
+cleanup:
+       free(walk_tree_ctx.curr_rev);
 }