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>
Dieser Commit ist enthalten in:
Ursprung
1a5e8633ce
Commit
1268afe836
1
cgit.h
1
cgit.h
@ -304,6 +304,7 @@ extern char *strlpart(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_free_reflist_inner(struct reflist *list);
|
||||
extern int cgit_refs_cb(const char *refname, const unsigned char *sha1,
|
||||
int flags, void *cb_data);
|
||||
|
||||
|
36
shared.c
36
shared.c
@ -176,6 +176,42 @@ static struct refinfo *cgit_mk_refinfo(const char *refname, const unsigned char
|
||||
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,
|
||||
void *cb_data)
|
||||
{
|
||||
|
@ -205,6 +205,8 @@ void cgit_print_branches(int maxcount)
|
||||
|
||||
if (maxcount < list.count)
|
||||
print_refs_link("heads");
|
||||
|
||||
cgit_free_reflist_inner(&list);
|
||||
}
|
||||
|
||||
void cgit_print_tags(int maxcount)
|
||||
@ -229,6 +231,8 @@ void cgit_print_tags(int maxcount)
|
||||
|
||||
if (maxcount < list.count)
|
||||
print_refs_link("tags");
|
||||
|
||||
cgit_free_reflist_inner(&list);
|
||||
}
|
||||
|
||||
void cgit_print_refs()
|
||||
|
Laden…
In neuem Issue referenzieren
Einen Benutzer sperren