Download raw body.
Diff memory leak
Hello all,
There is a memory leak within `got diff` that leaks line metadata.
******** Start dump got *******
M=8 I=1 F=1 U=1 J=2 R=0 X=0 C=0x449af07a cache=0 G=4096
Leak report:
f sum # avg
0xd551a917735 512 1 512 addr2line -e /home/kyle/bin/got 0x4e735
0xd57f17f70b0 64 1 64 addr2line -e /usr/lib/libc.so.100.1 0xa40b0
0xd57f182c4d1 112 7 16 addr2line -e /usr/lib/libc.so.100.1 0xd94d1
0xd57f18158d2 1024 1 1024 addr2line -e /usr/lib/libc.so.100.1 0xc28d2
0xd57f17aec53 69632 1 69632 addr2line -e /usr/lib/libc.so.100.1 0x5bc53
******** End dump got *******
Here is the diff to patch the memory leak
diff /home/kyle/src/got
commit - c89c70b628c1825024e333214392011409d71184
path + /home/kyle/src/got
blob - 245df76cba6ccd1d6c155ecbb3632f386db7f3e1
file + lib/diff.c
--- lib/diff.c
+++ lib/diff.c
@@ -1282,6 +1282,8 @@ diff_objects_as_trees(struct got_diff_line **lines, si
if (want_linemeta) {
*lines = arg.lines; /* was likely re-allocated */
*nlines = arg.nlines;
+ } else {
+ free(arg.lines);
}
done:
if (tree1)
My logic here is that this function need to free the memory it reallocs
if it doesn't give the callee function access to (free) the memory.
Alternatively, I can refactor so that the memory, NULL or not, will get
passed back up and have the caller free it. Thoughts?
Diff memory leak