]> git.ipfire.org Git - thirdparty/git.git/commitdiff
sequencer: stop leaking buf
authorDenton Liu <liu.denton@gmail.com>
Sat, 4 Apr 2020 01:11:16 +0000 (21:11 -0400)
committerJunio C Hamano <gitster@pobox.com>
Sun, 5 Apr 2020 21:15:09 +0000 (14:15 -0700)
In read_populate_opts(), we call read_oneliner() _after_ calling
strbuf_release(). This means that `buf` is leaked at the end of the
function.

Always clean up the strbuf by going to `done_rebase_i` whether or not
we return an error.

Signed-off-by: Denton Liu <liu.denton@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
sequencer.c

index e528225e787f4e26de604807efc798e8b967010e..faab0b13e8d72e3945111dbec3b423072a36fe9c 100644 (file)
@@ -2485,6 +2485,7 @@ static int read_populate_opts(struct replay_opts *opts)
 {
        if (is_rebase_i(opts)) {
                struct strbuf buf = STRBUF_INIT;
+               int ret = 0;
 
                if (read_oneliner(&buf, rebase_path_gpg_sign_opt(), 1)) {
                        if (!starts_with(buf.buf, "-S"))
@@ -2525,7 +2526,7 @@ static int read_populate_opts(struct replay_opts *opts)
                        opts->keep_redundant_commits = 1;
 
                read_strategy_opts(opts, &buf);
-               strbuf_release(&buf);
+               strbuf_reset(&buf);
 
                if (read_oneliner(&opts->current_fixups,
                                  rebase_path_current_fixups(), 1)) {
@@ -2538,12 +2539,16 @@ static int read_populate_opts(struct replay_opts *opts)
                }
 
                if (read_oneliner(&buf, rebase_path_squash_onto(), 0)) {
-                       if (get_oid_hex(buf.buf, &opts->squash_onto) < 0)
-                               return error(_("unusable squash-onto"));
+                       if (get_oid_hex(buf.buf, &opts->squash_onto) < 0) {
+                               ret = error(_("unusable squash-onto"));
+                               goto done_rebase_i;
+                       }
                        opts->have_squash_onto = 1;
                }
 
-               return 0;
+done_rebase_i:
+               strbuf_release(&buf);
+               return ret;
        }
 
        if (!file_exists(git_path_opts_file()))