Message ID | 20210725130830.5145-6-andrzej@ahunt.org (mailing list archive) |
---|---|
State | Accepted |
Commit | 4e3250b7fb806f3e391239d680638ee44068ffe1 |
Headers | show |
Series | [v2,01/12] fmt-merge-msg: free newly allocated temporary strings when done | expand |
andrzej@ahunt.org writes: > From: Andrzej Hunt <ajrhunt@google.com> > > 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: > 1ad69eb0dc (diffcore-rename: compute dir_rename_counts in stages, 2021-02-27) Yup. It is not surprising to have issues in younger parts of the code. Thanks.
diff --git a/diffcore-rename.c b/diffcore-rename.c index 2618bb07c1..c95857b51f 100644 --- a/diffcore-rename.c +++ b/diffcore-rename.c @@ -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) @@ -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;