Download raw body.
Got Status Memory Leak pt. 3
Here is the grand finale of this series. Here is the kdump from running `got status` ******** Start dump got ******* M=8 I=1 F=1 U=1 J=2 R=0 X=0 C=0xfe64220e cache=0 G=4096 Leak report: f sum # avg 0x17999bcc60 64 1 64 addr2line -e /usr/lib/libc.so.97.1 0x49c60 0x17999e3da1 112 7 16 addr2line -e /usr/lib/libc.so.97.1 0x70da1 0x1799a14b53 69632 1 69632 addr2line -e /usr/lib/libc.so.97.1 0xa1b53 0x14f1abad78 32 2 16 addr2line -e /home/kyle/bin/got 0x90d78 ******** End dump got ******* The got_pathlist_head never gets cleaned up in free_ignores(). The patch below will free it. While freeing the ignorelist in the TAILQ_FOREACH loop, the head of the list doesn't get freed. The puzzling part to me is that got_pathlist_free(ignores, GOT_PATHLIST_FREE_ALL) does not plug the leak, seems to reduce it though. But freeing it after the ignorelist seems to work. This patch has passed all regressions on my end. diff /home/kyle/src/got-dev commit - 6ecb0b8c6b2aa36b6af31c856909b1ddccdb301c path + /home/kyle/src/got-dev blob - 4415674d74999e7b6fef5dd651fa76682cc19ca1 file + lib/worktree.c --- lib/worktree.c +++ lib/worktree.c @@ -3721,6 +3721,7 @@ free_ignores(struct got_pathlist_head *ignores) struct got_pathlist_head *ignorelist = pe->data; got_pathlist_free(ignorelist, GOT_PATHLIST_FREE_PATH); + free(ignorelist); } got_pathlist_free(ignores, GOT_PATHLIST_FREE_PATH); } @@ -3777,6 +3778,7 @@ done: if (err || pe == NULL) { free(dirpath); got_pathlist_free(ignorelist, GOT_PATHLIST_FREE_PATH); + free(ignorelist); } return err; } Here is the kdump of `got status` after the patch is applied. ******** Start dump got ******* M=8 I=1 F=1 U=1 J=2 R=0 X=0 C=0x3c2d4632 cache=0 G=4096 Leak report: f sum # avg 0xb88c3283c60 64 1 64 addr2line -e /usr/lib/libc.so.97.1 0x49c60 0xb88c32aada1 112 7 16 addr2line -e /usr/lib/libc.so.97.1 0x70da1 0xb88c32dbb53 69632 1 69632 addr2line -e /usr/lib/libc.so.97.1 0xa1b53 ******** End dump got ******* Comments/sugguestions/oks?
Got Status Memory Leak pt. 3