{"thread":{"id":"55208","subject":"Re: [PATCH] commit-graph: avoid leaking topo_levels slab in write_commit_graph()","startedAt":"2021-02-25T06:27:22Z","lastAt":"2021-02-25T06:27:22Z","messageCount":1,"participants":["Abhishek Kumar"],"isPatch":true,"patchVersion":1,"patchTotal":null},"messages":[{"id":"417790","messageId":"YDdDCMMf4Csumeci@Abhishek-Arch","threadId":"55208","inReplyTo":null,"subject":"Re: [PATCH] commit-graph: avoid leaking topo_levels slab in write_commit_graph()","fromName":"Abhishek Kumar","fromEmail":"abhishekkumar8222@gmail.com","sentAt":"2021-02-25T06:26:16Z","receivedAt":"2021-02-25T06:27:22Z","isPatch":true,"sender":{"key":"abhishekkumar8222@gmail.com","avatar":"https://avatars.githubusercontent.com/u/31231064?v=4"},"body":"\"Andrzej Hunt via GitGitGadget\" <gitgitgadget@gmail.com> writes:\n\n> From: Andrzej Hunt <ajrhunt@google.com>\n> \n> write_commit_graph initialises topo_levels using init_topo_level_slab(),\n> next it calls compute_topological_levels() which can cause the slab to\n> grow, we therefore need to clear the slab again using\n> clear_topo_level_slab() when we're done.\n> \n> First introduced in 72a2bfcaf01860ce8dd6921490d903dc0ad59c89 - which\n> is currently only in master and not on maint.\n> \n\nThanks for identifying and fixing this memory leak!\n- Abhishek\n\n> LeakSanitizer output:\n> ==1026==ERROR: LeakSanitizer: detected memory leaks\n\n> Direct leak of 8 byte(s) in 1 object(s) allocated from:\n>     #0 0x498ae9 in realloc /src/llvm-project/compiler-rt/lib/asan/asan_malloc_linux.cpp:164:3\n>     #1 0xafbed8 in xrealloc /src/git/wrapper.c:126:8\n>     #2 0x7966d1 in topo_level_slab_at_peek /src/git/commit-graph.c:71:1\n>     #3 0x7965e0 in topo_level_slab_at /src/git/commit-graph.c:71:1\n>     #4 0x78fbf5 in compute_topological_levels /src/git/commit-graph.c:1472:12\n>     #5 0x78c5c3 in write_commit_graph /src/git/commit-graph.c:2456:2\n>     #6 0x535c5f in graph_write /src/git/builtin/commit-graph.c:299:6\n>     #7 0x5350ca in cmd_commit_graph /src/git/builtin/commit-graph.c:337:11\n>     #8 0x4cddb1 in run_builtin /src/git/git.c:453:11\n>     #9 0x4cabe2 in handle_builtin /src/git/git.c:704:3\n>     #10 0x4cd084 in run_argv /src/git/git.c:771:4\n>     #11 0x4ca424 in cmd_main /src/git/git.c:902:19\n>     #12 0x707fb6 in main /src/git/common-main.c:52:11\n>     #13 0x7fee4249383f in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x2083f)\n\n> Indirect leak of 524256 byte(s) in 1 object(s) allocated from:\n>     #0 0x498942 in calloc /src/llvm-project/compiler-rt/lib/asan/asan_malloc_linux.cpp:154:3\n>     #1 0xafc088 in xcalloc /src/git/wrapper.c:140:8\n>     #2 0x796870 in topo_level_slab_at_peek /src/git/commit-graph.c:71:1\n>     #3 0x7965e0 in topo_level_slab_at /src/git/commit-graph.c:71:1\n>     #4 0x78fbf5 in compute_topological_levels /src/git/commit-graph.c:1472:12\n>     #5 0x78c5c3 in write_commit_graph /src/git/commit-graph.c:2456:2\n>     #6 0x535c5f in graph_write /src/git/builtin/commit-graph.c:299:6\n>     #7 0x5350ca in cmd_commit_graph /src/git/builtin/commit-graph.c:337:11\n>     #8 0x4cddb1 in run_builtin /src/git/git.c:453:11\n>     #9 0x4cabe2 in handle_builtin /src/git/git.c:704:3\n>     #10 0x4cd084 in run_argv /src/git/git.c:771:4\n>     #11 0x4ca424 in cmd_main /src/git/git.c:902:19\n>     #12 0x707fb6 in main /src/git/common-main.c:52:11\n>     #13 0x7fee4249383f in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x2083f)\n\n> SUMMARY: AddressSanitizer: 524264 byte(s) leaked in 2 allocation(s).\n\n> Signed-off-by: Andrzej Hunt <ajrhunt@google.com>\n> ---\n>     commit-graph: avoid leaking topo_levels slab in write_commit_graph()\n>     \n>     write_commit_graph initialises topo_levels using init_topo_level_slab(),\n>     next it calls compute_topological_levels() which can cause the slab to\n>     grow, we therefore need to clear the slab again using\n>     clear_topo_level_slab() when we're done.\n>     \n>     First introduced in 72a2bfcaf01860ce8dd6921490d903dc0ad59c89 - which is\n>     currently only in master and not on maint.\n>     \n>     LeakSanitizer output:\n>     \n>     ==1026==ERROR: LeakSanitizer: detected memory leaks\n>     \n>     Direct leak of 8 byte(s) in 1 object(s) allocated from: #0 0x498ae9 in\n>     realloc\n>     /src/llvm-project/compiler-rt/lib/asan/asan_malloc_linux.cpp:164:3 #1\n>     0xafbed8 in xrealloc /src/git/wrapper.c:126:8 #2 0x7966d1 in\n>     topo_level_slab_at_peek /src/git/commit-graph.c:71:1 #3 0x7965e0 in\n>     topo_level_slab_at /src/git/commit-graph.c:71:1 #4 0x78fbf5 in\n>     compute_topological_levels /src/git/commit-graph.c:1472:12 #5 0x78c5c3\n>     in write_commit_graph /src/git/commit-graph.c:2456:2 #6 0x535c5f in\n>     graph_write /src/git/builtin/commit-graph.c:299:6 #7 0x5350ca in\n>     cmd_commit_graph /src/git/builtin/commit-graph.c:337:11 #8 0x4cddb1 in\n>     run_builtin /src/git/git.c:453:11 #9 0x4cabe2 in handle_builtin\n>     /src/git/git.c:704:3 #10 0x4cd084 in run_argv /src/git/git.c:771:4 #11\n>     0x4ca424 in cmd_main /src/git/git.c:902:19 #12 0x707fb6 in main\n>     /src/git/common-main.c:52:11 #13 0x7fee4249383f in __libc_start_main\n>     (/lib/x86_64-linux-gnu/libc.so.6+0x2083f)\n>     \n>     Indirect leak of 524256 byte(s) in 1 object(s) allocated from: #0\n>     0x498942 in calloc\n>     /src/llvm-project/compiler-rt/lib/asan/asan_malloc_linux.cpp:154:3 #1\n>     0xafc088 in xcalloc /src/git/wrapper.c:140:8 #2 0x796870 in\n>     topo_level_slab_at_peek /src/git/commit-graph.c:71:1 #3 0x7965e0 in\n>     topo_level_slab_at /src/git/commit-graph.c:71:1 #4 0x78fbf5 in\n>     compute_topological_levels /src/git/commit-graph.c:1472:12 #5 0x78c5c3\n>     in write_commit_graph /src/git/commit-graph.c:2456:2 #6 0x535c5f in\n>     graph_write /src/git/builtin/commit-graph.c:299:6 #7 0x5350ca in\n>     cmd_commit_graph /src/git/builtin/commit-graph.c:337:11 #8 0x4cddb1 in\n>     run_builtin /src/git/git.c:453:11 #9 0x4cabe2 in handle_builtin\n>     /src/git/git.c:704:3 #10 0x4cd084 in run_argv /src/git/git.c:771:4 #11\n>     0x4ca424 in cmd_main /src/git/git.c:902:19 #12 0x707fb6 in main\n>     /src/git/common-main.c:52:11 #13 0x7fee4249383f in __libc_start_main\n>     (/lib/x86_64-linux-gnu/libc.so.6+0x2083f)\n>     \n>     SUMMARY: AddressSanitizer: 524264 byte(s) leaked in 2 allocation(s).\n\n> Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-881%2Fahunt%2Fcommit-graph-leak-v1\n> Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-881/ahunt/commit-graph-leak-v1\n> Pull-Request: https://github.com/gitgitgadget/git/pull/881\n\n>  commit-graph.c | 1 +\n>  1 file changed, 1 insertion(+)\n\n> diff --git a/commit-graph.c b/commit-graph.c\n> index ed31843fa522..9529ec552139 100644\n> --- a/commit-graph.c\n> +++ b/commit-graph.c\n> @@ -2471,6 +2471,7 @@ int write_commit_graph(struct object_directory *odb,\n>         free(ctx->graph_name);\n>         free(ctx->commits.list);\n>         oid_array_clear(&ctx->oids);\n> +\tclear_topo_level_slab(&topo_levels);\n>  \n>         if (ctx->commit_graph_filenames_after) {\n>                 for (i = 0; i < ctx->num_commit_graphs_after; i++) {\n\n> base-commit: 2283e0e9af55689215afa39c03beb2315ce18e83\n> -- \n> gitgitgadget\n"}]}