From: Kyle Ackerman Subject: Got Status Memory Leak pt. 2 To: gameoftrees@openbsd.org Date: Mon, 04 Dec 2023 10:38:23 -0600 Hi all, Same methodology as the previous thread. Here is the kdump from `got status`. ******** Start dump got ******* M=8 I=1 F=0 U=0 J=1 R=0 X=0 C=0 cache=64 G=0 Leak report: f sum # avg 0x88dc57d64f0 64 1 64 addr2line -e /usr/lib/libc.so.97.1 0xcf4f0 0x88dc5762621 112 7 16 addr2line -e /usr/lib/libc.so.97.1 0x5b621 0x88dc5757623 65536 1 65536 addr2line -e /usr/lib/libc.so.97.1 0x50623 0x88b2ac03eff 16800 350 48 addr2line -e /home/kyle/bin/got 0x5beff 0x88b2ac38d68 48 3 16 addr2line -e /home/kyle/bin/got 0x90d68 ******** End dump got ******* The patch below will clean up the missing_children TAILQ in worktree_status(). I was hesitant to use GOT_PATHLIST_FREE_NONE but it looks like find_missing_children() sets the data field to NULL and the path field is assigned to one of the fileindex->entries. In got_worktree_status, the fileindex is cleaned up with "got_fileindex_free(fileindex)". Using GOT_PATHLIST_FREE_PATH above results in a double free. We could use GOT_PATHLIST_FREE_DATA but I ~think~ that is redundant as data is set to NULL (stated above). All regression tests have passed on my end. diff /home/kyle/src/got-dev commit - d0b9836b2ff0ddbe37b3dea6be10afdb14b65175 path + /home/kyle/src/got-dev blob - c419422fe5a36542e706bb231e2eddf6e3e0fd63 file + lib/worktree.c --- lib/worktree.c +++ lib/worktree.c @@ -4211,6 +4211,7 @@ worktree_status(struct got_worktree *worktree, const c } done: free_ignores(&ignores); + got_pathlist_free(&missing_children, GOT_PATHLIST_FREE_NONE); if (fd != -1 && close(fd) == -1 && err == NULL) err = got_error_from_errno("close"); free(ondisk_path); Here is the kdump after the patch is applied. ******** Start dump got ******* M=8 I=1 F=0 U=0 J=1 R=0 X=0 C=0 cache=64 G=0 Leak report: f sum # avg 0xa4c8fe454f0 64 1 64 addr2line -e /usr/lib/libc.so.97.1 0xcf4f0 0xa4c8fdd1621 112 7 16 addr2line -e /usr/lib/libc.so.97.1 0x5b621 0xa4c8fdc6623 65536 1 65536 addr2line -e /usr/lib/libc.so.97.1 0x50623 0xa4a4cc14d88 48 3 16 addr2line -e /home/kyle/bin/got 0x90d88 ******** End dump got ******* Comments/ok?