Skip to content

Commit

Permalink
diffcore-rename: move old_dir/new_dir definition to plug leak
Browse files Browse the repository at this point in the history
old_dir/new_dir are free()'d at the end of update_dir_rename_counts,
however if we return early we'll never free those strings. Therefore
we should move all new allocations after the possible early return,
avoiding a leak.

This seems like a fairly recent leak, that started happening since the
early-return was added in:
  1ad69eb (diffcore-rename: compute dir_rename_counts in stages, 2021-02-27)

LSAN output from t0022:

Direct leak of 7 byte(s) in 1 object(s) allocated from:
    #0 0x486804 in strdup ../projects/compiler-rt/lib/asan/asan_interceptors.cpp:452:3
    #1 0xa71e48 in xstrdup wrapper.c:29:14
    #2 0x7db9c7 in update_dir_rename_counts diffcore-rename.c:464:12
    #3 0x7db6ae in find_renames diffcore-rename.c:1062:3
    #4 0x7d76c3 in diffcore_rename_extended diffcore-rename.c:1472:18
    #5 0x7b4cfc in diffcore_std diff.c:6705:4
    #6 0x855e46 in log_tree_diff_flush log-tree.c:846:2
    #7 0x856574 in log_tree_diff log-tree.c:955:3
    git#8 0x856574 in log_tree_commit log-tree.c:986:10
    git#9 0x9a9c67 in print_commit_summary sequencer.c:1329:7
    git#10 0x52e623 in cmd_commit builtin/commit.c:1862:3
    git#11 0x4ce83e in run_builtin git.c:475:11
    git#12 0x4ccafe in handle_builtin git.c:729:3
    git#13 0x4cb01c in run_argv git.c:818:4
    git#14 0x4cb01c in cmd_main git.c:949:19
    git#15 0x6b3f3d in main common-main.c:52:11
    git#16 0x7fe397c7a349 in __libc_start_main (/lib64/libc.so.6+0x24349)

Direct leak of 7 byte(s) in 1 object(s) allocated from:
    #0 0x486804 in strdup ../projects/compiler-rt/lib/asan/asan_interceptors.cpp:452:3
    #1 0xa71e48 in xstrdup wrapper.c:29:14
    #2 0x7db9bc in update_dir_rename_counts diffcore-rename.c:463:12
    #3 0x7db6ae in find_renames diffcore-rename.c:1062:3
    #4 0x7d76c3 in diffcore_rename_extended diffcore-rename.c:1472:18
    #5 0x7b4cfc in diffcore_std diff.c:6705:4
    #6 0x855e46 in log_tree_diff_flush log-tree.c:846:2
    #7 0x856574 in log_tree_diff log-tree.c:955:3
    git#8 0x856574 in log_tree_commit log-tree.c:986:10
    git#9 0x9a9c67 in print_commit_summary sequencer.c:1329:7
    git#10 0x52e623 in cmd_commit builtin/commit.c:1862:3
    git#11 0x4ce83e in run_builtin git.c:475:11
    git#12 0x4ccafe in handle_builtin git.c:729:3
    git#13 0x4cb01c in run_argv git.c:818:4
    git#14 0x4cb01c in cmd_main git.c:949:19
    git#15 0x6b3f3d in main common-main.c:52:11
    git#16 0x7fe397c7a349 in __libc_start_main (/lib64/libc.so.6+0x24349)

SUMMARY: AddressSanitizer: 14 byte(s) leaked in 2 allocation(s).

Signed-off-by: Andrzej Hunt <andrzej@ahunt.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
ahunt authored and gitster committed Jul 26, 2021
1 parent 2b29994 commit 4e3250b
Showing 1 changed file with 7 additions and 3 deletions.
10 changes: 7 additions & 3 deletions diffcore-rename.c
Original file line number Diff line number Diff line change
Expand Up @@ -448,9 +448,9 @@ static void update_dir_rename_counts(struct dir_rename_info *info,
const char *oldname,
const char *newname)
{
char *old_dir = xstrdup(oldname);
char *new_dir = xstrdup(newname);
char new_dir_first_char = new_dir[0];
char *old_dir;
char *new_dir;
const char new_dir_first_char = newname[0];
int first_time_in_loop = 1;

if (!info->setup)
Expand All @@ -475,6 +475,10 @@ static void update_dir_rename_counts(struct dir_rename_info *info,
*/
return;


old_dir = xstrdup(oldname);
new_dir = xstrdup(newname);

while (1) {
int drd_flag = NOT_RELEVANT;

Expand Down

0 comments on commit 4e3250b

Please sign in to comment.