diff options
author | Ævar Arnfjörð Bjarmason <avarab@gmail.com> | 2023-02-06 20:08:08 +0100 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2023-02-07 01:03:52 +0100 |
commit | 9ff2f0606915cf76fc4865bddf639fd5fd2cba29 (patch) | |
tree | 148786a6b70ef1df91d9e08bc77dfad6169c4f11 /sequencer.h | |
parent | sequencer.c: split up sequencer_remove_state() (diff) | |
download | git-9ff2f0606915cf76fc4865bddf639fd5fd2cba29.tar.xz git-9ff2f0606915cf76fc4865bddf639fd5fd2cba29.zip |
sequencer API users: fix get_replay_opts() leaks
Make the replay_opts_release() function added in the preceding commit
non-static, and use it for freeing the "struct replay_opts"
constructed for "rebase" and "revert".
To safely call our new replay_opts_release() we'll need to stop
calling it in sequencer_remove_state(), and instead call it where we
allocate the "struct replay_opts" itself.
This is because in e.g. do_interactive_rebase() we construct a "struct
replay_opts" with "get_replay_opts()", and then call
"complete_action()". If we get far enough in that function without
encountering errors we'll call "pick_commits()" which (indirectly)
calls sequencer_remove_state() at the end.
But if we encounter errors anywhere along the way we'd punt out early,
and not free() the memory we allocated. Remembering whether we
previously called sequencer_remove_state() would be a hassle.
Using a FREE_AND_NULL() pattern would also work, as it would be safe
to call replay_opts_release() repeatedly. But let's fix this properly
instead, by having the owner of the data free() it.
Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'sequencer.h')
-rw-r--r-- | sequencer.h | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/sequencer.h b/sequencer.h index 888c18aad7..3bcdfa1b58 100644 --- a/sequencer.h +++ b/sequencer.h @@ -158,6 +158,7 @@ int sequencer_pick_revisions(struct repository *repo, int sequencer_continue(struct repository *repo, struct replay_opts *opts); int sequencer_rollback(struct repository *repo, struct replay_opts *opts); int sequencer_skip(struct repository *repo, struct replay_opts *opts); +void replay_opts_release(struct replay_opts *opts); int sequencer_remove_state(struct replay_opts *opts); #define TODO_LIST_KEEP_EMPTY (1U << 0) |