mirror of
https://github.com/git/git.git
synced 2024-11-08 15:19:28 +01:00
revision: fix leaking display notes
We never free the display notes options embedded into `struct revision`. Implement a new function `release_display_notes()` that we can call in `release_revisions()` to fix this. There is another gotcha here though: we play some games with the string list used to track extra notes refs, where we sometimes set the bit that indicates that strings should be strdup'd and sometimes unset it. This dance is done to avoid a copy of an already-allocated string when we call `enable_ref_display_notes()`. But this dance is rather pointless as we can instead call `string_list_append_nodup()` to transfer ownership of the allocated string to the list. Refactor the code to do so and drop the `strdup_strings` dance. Signed-off-by: Patrick Steinhardt <ps@pks.im> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
3d31d38255
commit
9748537437
12
notes.c
12
notes.c
@ -1060,6 +1060,12 @@ void init_display_notes(struct display_notes_opt *opt)
|
|||||||
{
|
{
|
||||||
memset(opt, 0, sizeof(*opt));
|
memset(opt, 0, sizeof(*opt));
|
||||||
opt->use_default_notes = -1;
|
opt->use_default_notes = -1;
|
||||||
|
string_list_init_dup(&opt->extra_notes_refs);
|
||||||
|
}
|
||||||
|
|
||||||
|
void release_display_notes(struct display_notes_opt *opt)
|
||||||
|
{
|
||||||
|
string_list_clear(&opt->extra_notes_refs, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void enable_default_display_notes(struct display_notes_opt *opt, int *show_notes)
|
void enable_default_display_notes(struct display_notes_opt *opt, int *show_notes)
|
||||||
@ -1073,7 +1079,7 @@ void enable_ref_display_notes(struct display_notes_opt *opt, int *show_notes,
|
|||||||
struct strbuf buf = STRBUF_INIT;
|
struct strbuf buf = STRBUF_INIT;
|
||||||
strbuf_addstr(&buf, ref);
|
strbuf_addstr(&buf, ref);
|
||||||
expand_notes_ref(&buf);
|
expand_notes_ref(&buf);
|
||||||
string_list_append(&opt->extra_notes_refs,
|
string_list_append_nodup(&opt->extra_notes_refs,
|
||||||
strbuf_detach(&buf, NULL));
|
strbuf_detach(&buf, NULL));
|
||||||
*show_notes = 1;
|
*show_notes = 1;
|
||||||
}
|
}
|
||||||
@ -1081,11 +1087,7 @@ void enable_ref_display_notes(struct display_notes_opt *opt, int *show_notes,
|
|||||||
void disable_display_notes(struct display_notes_opt *opt, int *show_notes)
|
void disable_display_notes(struct display_notes_opt *opt, int *show_notes)
|
||||||
{
|
{
|
||||||
opt->use_default_notes = -1;
|
opt->use_default_notes = -1;
|
||||||
/* we have been strdup'ing ourselves, so trick
|
|
||||||
* string_list into free()ing strings */
|
|
||||||
opt->extra_notes_refs.strdup_strings = 1;
|
|
||||||
string_list_clear(&opt->extra_notes_refs, 0);
|
string_list_clear(&opt->extra_notes_refs, 0);
|
||||||
opt->extra_notes_refs.strdup_strings = 0;
|
|
||||||
*show_notes = 0;
|
*show_notes = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
5
notes.h
5
notes.h
@ -275,6 +275,11 @@ struct display_notes_opt {
|
|||||||
*/
|
*/
|
||||||
void init_display_notes(struct display_notes_opt *opt);
|
void init_display_notes(struct display_notes_opt *opt);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Release resources acquired by the display_notes_opt.
|
||||||
|
*/
|
||||||
|
void release_display_notes(struct display_notes_opt *opt);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This family of functions enables or disables the display of notes. In
|
* This family of functions enables or disables the display of notes. In
|
||||||
* particular, 'enable_default_display_notes' will display the default notes,
|
* particular, 'enable_default_display_notes' will display the default notes,
|
||||||
|
@ -3168,6 +3168,7 @@ void release_revisions(struct rev_info *revs)
|
|||||||
{
|
{
|
||||||
free_commit_list(revs->commits);
|
free_commit_list(revs->commits);
|
||||||
free_commit_list(revs->ancestry_path_bottoms);
|
free_commit_list(revs->ancestry_path_bottoms);
|
||||||
|
release_display_notes(&revs->notes_opt);
|
||||||
object_array_clear(&revs->pending);
|
object_array_clear(&revs->pending);
|
||||||
object_array_clear(&revs->boundary_commits);
|
object_array_clear(&revs->boundary_commits);
|
||||||
release_revisions_cmdline(&revs->cmdline);
|
release_revisions_cmdline(&revs->cmdline);
|
||||||
|
@ -5,6 +5,7 @@
|
|||||||
|
|
||||||
test_description='Test commit notes'
|
test_description='Test commit notes'
|
||||||
|
|
||||||
|
TEST_PASSES_SANITIZE_LEAK=true
|
||||||
. ./test-lib.sh
|
. ./test-lib.sh
|
||||||
|
|
||||||
write_script fake_editor <<\EOF
|
write_script fake_editor <<\EOF
|
||||||
|
Loading…
Reference in New Issue
Block a user