Free reflists after usage

Free reflists in cgit_print_branches() and in cgit_print_tags() before
returning reflist structures to the stack.

This fixes following memory leaks seen with "PATH_INFO=/cgit/refs/":

    ==5710== 1,312 (32 direct, 1,280 indirect) bytes in 1 blocks are definitely lost in loss record 63 of 71
    ==5710==    at 0x4C2C04B: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
    ==5710==    by 0x4C2C2FF: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
    ==5710==    by 0x46CA9B: xrealloc (wrapper.c:100)
    ==5710==    by 0x40AAA6: cgit_add_ref (shared.c:156)
    ==5710==    by 0x40ABC4: cgit_refs_cb (shared.c:186)
    ==5710==    by 0x44BCBA: do_one_ref (refs.c:527)
    ==5710==    by 0x44D240: do_for_each_ref_in_dir (refs.c:553)
    ==5710==    by 0x44D6BA: do_for_each_ref (refs.c:1298)
    ==5710==    by 0x410FE2: cgit_print_branches (ui-refs.c:191)
    ==5710==    by 0x4111E9: cgit_print_refs (ui-refs.c:244)
    ==5710==    by 0x407C85: refs_fn (cmd.c:105)
    ==5710==    by 0x405DDF: process_request (cgit.c:566)
    ==5710==
    ==5710== 6,846 (256 direct, 6,590 indirect) bytes in 1 blocks are definitely lost in loss record 68 of 71
    ==5710==    at 0x4C2C25E: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
    ==5710==    by 0x46CA9B: xrealloc (wrapper.c:100)
    ==5710==    by 0x40AAA6: cgit_add_ref (shared.c:156)
    ==5710==    by 0x40ABC4: cgit_refs_cb (shared.c:186)
    ==5710==    by 0x44BCBA: do_one_ref (refs.c:527)
    ==5710==    by 0x44D240: do_for_each_ref_in_dir (refs.c:553)
    ==5710==    by 0x44D6EC: do_for_each_ref (refs.c:1288)
    ==5710==    by 0x4110D5: cgit_print_tags (ui-refs.c:218)
    ==5710==    by 0x4111FD: cgit_print_refs (ui-refs.c:246)
    ==5710==    by 0x407C85: refs_fn (cmd.c:105)
    ==5710==    by 0x405DDF: process_request (cgit.c:566)
    ==5710==    by 0x407490: cache_process (cache.c:322)

Signed-off-by: Lukas Fleischer <cgit@cryptocrack.de>
このコミットが含まれているのは:
Lukas Fleischer 2013-03-04 13:25:33 +01:00 committed by Jason A. Donenfeld
コミット 1268afe836
3個のファイルの変更41行の追加0行の削除

1
cgit.h
ファイルの表示

@ -304,6 +304,7 @@ extern char *strlpart(char *txt, int maxlen);
extern char *strrpart(char *txt, int maxlen); extern char *strrpart(char *txt, int maxlen);
extern void cgit_add_ref(struct reflist *list, struct refinfo *ref); extern void cgit_add_ref(struct reflist *list, struct refinfo *ref);
extern void cgit_free_reflist_inner(struct reflist *list);
extern int cgit_refs_cb(const char *refname, const unsigned char *sha1, extern int cgit_refs_cb(const char *refname, const unsigned char *sha1,
int flags, void *cb_data); int flags, void *cb_data);

ファイルの表示

@ -176,6 +176,42 @@ static struct refinfo *cgit_mk_refinfo(const char *refname, const unsigned char
return ref; return ref;
} }
static void cgit_free_taginfo(struct taginfo *tag)
{
if (tag->tagger)
free(tag->tagger);
if (tag->tagger_email)
free(tag->tagger_email);
if (tag->msg)
free(tag->msg);
free(tag);
}
static void cgit_free_refinfo(struct refinfo *ref)
{
if (ref->refname)
free((char *)ref->refname);
switch (ref->object->type) {
case OBJ_TAG:
cgit_free_taginfo(ref->tag);
break;
case OBJ_COMMIT:
cgit_free_commitinfo(ref->commit);
break;
}
free(ref);
}
void cgit_free_reflist_inner(struct reflist *list)
{
int i;
for (i = 0; i < list->count; i++) {
cgit_free_refinfo(list->refs[i]);
}
free(list->refs);
}
int cgit_refs_cb(const char *refname, const unsigned char *sha1, int flags, int cgit_refs_cb(const char *refname, const unsigned char *sha1, int flags,
void *cb_data) void *cb_data)
{ {

ファイルの表示

@ -205,6 +205,8 @@ void cgit_print_branches(int maxcount)
if (maxcount < list.count) if (maxcount < list.count)
print_refs_link("heads"); print_refs_link("heads");
cgit_free_reflist_inner(&list);
} }
void cgit_print_tags(int maxcount) void cgit_print_tags(int maxcount)
@ -229,6 +231,8 @@ void cgit_print_tags(int maxcount)
if (maxcount < list.count) if (maxcount < list.count)
print_refs_link("tags"); print_refs_link("tags");
cgit_free_reflist_inner(&list);
} }
void cgit_print_refs() void cgit_print_refs()