mbox series

[00/17] leak fixes: use existing constructors & other trivia

Message ID cover-00.17-00000000000-20221103T164632Z-avarab@gmail.com (mailing list archive)
Headers show
Series leak fixes: use existing constructors & other trivia | expand

Message

Ævar Arnfjörð Bjarmason Nov. 3, 2022, 5:05 p.m. UTC
With the very minor exceptions of:

* 03-04/17 (which need trivial oilerplate)
* 05/17 (need to add trivial control flow to a free_*() function)
* 12/17 (narrowing scope of allocation)
* 17/17: Add "goto ret" pattern, combine two "ret" variables

These are all "one-line" leak fixes where we merely need to make use
of an existing release function. The "one-line" only having the slight
disclaimer of needing to e.g. add braces to an "if" in one case, etc.

Each commit in this series is tested with:

	GIT_TEST_PASSING_SANITIZE_LEAK=check GIT_TEST_SANITIZE_LEAK_LOG=true \
	make SANITIZE=leak test

I.e. mark tests as leak-free as we fix the leaks.

In 17/17 I replace uses of UNLEAK() where we can just as easily free()
instead, i.e. most of it's built-ins doing UNLEAK(x) instead of
strbuf_release(&x) etc.

As 17/17 notes I still think these's a place for unleak (some of the
remaining ones are quite tricky), but that we gain more from leaving
it for those tricky cases. Before this series we have 28 uses of
UNLEAK(), after it's 15.

Ævar Arnfjörð Bjarmason (17):
  tests: mark tests as passing with SANITIZE=leak
  {reset,merge}: call discard_index() before returning
  commit: discard partial cache before (re-)reading it
  read-cache.c: clear and free "sparse_checkout_patterns"
  dir.c: free "ident" and "exclude_per_dir" in "struct untracked_cache"
  built-ins & libs & helpers: add/move destructors, fix leaks
  unpack-file: fix ancient leak in create_temp_file()
  revision API: call graph_clear() in release_revisions()
  ls-files: fix a --with-tree memory leak
  sequencer.c: fix "opts->strategy" leak in read_strategy_opts()
  connected.c: free the "struct packed_git"
  sequencer.c: fix a pick_commits() leak
  rebase: don't leak on "--abort"
  sequencer.c: fix sequencer_continue() leak
  cherry-pick: free "struct replay_opts" members
  revert: fix parse_options_concat() leak
  built-ins: use free() not UNLEAK() if trivial, rm dead code

 builtin/add.c                            |  2 +-
 builtin/bugreport.c                      |  9 +++--
 builtin/checkout.c                       |  2 ++
 builtin/commit.c                         | 13 +++++---
 builtin/config.c                         | 42 +++++++++++-------------
 builtin/diff.c                           |  2 +-
 builtin/ls-files.c                       |  1 +
 builtin/merge.c                          |  1 +
 builtin/rebase.c                         |  4 +++
 builtin/repack.c                         |  2 +-
 builtin/reset.c                          |  2 ++
 builtin/rev-parse.c                      |  1 +
 builtin/revert.c                         |  4 +++
 builtin/stash.c                          |  2 ++
 builtin/unpack-file.c                    |  1 +
 builtin/worktree.c                       |  7 ++--
 connected.c                              |  6 +++-
 dir.c                                    | 10 ++++--
 dir.h                                    |  1 +
 read-cache.c                             |  5 +++
 ref-filter.c                             |  1 +
 revision.c                               |  1 +
 sequencer.c                              | 12 +++++--
 t/helper/test-fake-ssh.c                 |  1 +
 t/t0068-for-each-repo.sh                 |  1 +
 t/t0070-fundamental.sh                   |  1 +
 t/t1011-read-tree-sparse-checkout.sh     |  1 +
 t/t1022-read-tree-partial-clone.sh       |  2 +-
 t/t1404-update-ref-errors.sh             |  2 ++
 t/t1409-avoid-packing-refs.sh            |  1 +
 t/t1413-reflog-detach.sh                 |  1 +
 t/t1501-work-tree.sh                     |  2 ++
 t/t2012-checkout-last.sh                 |  1 +
 t/t2018-checkout-branch.sh               |  1 +
 t/t2025-checkout-no-overlay.sh           |  1 +
 t/t3009-ls-files-others-nonsubmodule.sh  |  1 +
 t/t3010-ls-files-killed-modified.sh      |  2 ++
 t/t3050-subprojects-fetch.sh             |  1 +
 t/t3060-ls-files-with-tree.sh            |  2 ++
 t/t3409-rebase-environ.sh                |  1 +
 t/t3413-rebase-hook.sh                   |  1 +
 t/t3428-rebase-signoff.sh                |  1 +
 t/t3429-rebase-edit-todo.sh              |  1 +
 t/t3433-rebase-across-mode-change.sh     |  1 +
 t/t4015-diff-whitespace.sh               |  4 +--
 t/t4045-diff-relative.sh                 |  2 ++
 t/t4052-stat-output.sh                   |  1 +
 t/t4053-diff-no-index.sh                 |  1 +
 t/t4067-diff-partial-clone.sh            |  1 +
 t/t4111-apply-subdir.sh                  |  1 +
 t/t4135-apply-weird-filenames.sh         |  1 +
 t/t4213-log-tabexpand.sh                 |  1 +
 t/t5544-pack-objects-hook.sh             |  2 ++
 t/t5554-noop-fetch-negotiator.sh         |  2 ++
 t/t5610-clone-detached.sh                |  1 +
 t/t5611-clone-config.sh                  |  1 +
 t/t5614-clone-submodules-shallow.sh      |  1 +
 t/t5617-clone-submodules-remote.sh       |  1 +
 t/t5618-alternate-refs.sh                |  2 ++
 t/t6060-merge-index.sh                   |  2 ++
 t/t6301-for-each-ref-errors.sh           |  1 +
 t/t6401-merge-criss-cross.sh             |  2 ++
 t/t6406-merge-attr.sh                    |  1 +
 t/t6407-merge-binary.sh                  |  1 +
 t/t6415-merge-dir-to-symlink.sh          |  1 +
 t/t6435-merge-sparse.sh                  |  1 +
 t/t7103-reset-bare.sh                    |  2 +-
 t/t7504-commit-msg-hook.sh               |  1 +
 t/t7517-per-repo-email.sh                |  1 +
 t/t7520-ignored-hook-warning.sh          |  1 +
 t/t7605-merge-resolve.sh                 |  1 +
 t/t7614-merge-signoff.sh                 |  1 +
 t/t9003-help-autocorrect.sh              |  2 ++
 t/t9115-git-svn-dcommit-funky-renames.sh |  1 -
 t/t9146-git-svn-empty-dirs.sh            |  1 -
 t/t9148-git-svn-propset.sh               |  1 -
 t/t9160-git-svn-preserve-empty-dirs.sh   |  1 -
 77 files changed, 150 insertions(+), 51 deletions(-)

Comments

Phillip Wood Nov. 4, 2022, 3:20 p.m. UTC | #1
On 03/11/2022 17:05, Ævar Arnfjörð Bjarmason wrote:
> With the very minor exceptions of:
> 
> * 03-04/17 (which need trivial oilerplate)
> * 05/17 (need to add trivial control flow to a free_*() function)
> * 12/17 (narrowing scope of allocation)

I've only looked at the rebase related patches. I'd really appreciate it 
if you could drop patches 12 & 14 as they conflict with [1] that fixes 
these issues by removing the setenv() calls.

Thanks

Phillip

[1] 
https://lore.kernel.org/git/pull.1405.git.1667575142.gitgitgadget@gmail.com

> * 17/17: Add "goto ret" pattern, combine two "ret" variables
> 
> These are all "one-line" leak fixes where we merely need to make use
> of an existing release function. The "one-line" only having the slight
> disclaimer of needing to e.g. add braces to an "if" in one case, etc.
> 
> Each commit in this series is tested with:
> 
> 	GIT_TEST_PASSING_SANITIZE_LEAK=check GIT_TEST_SANITIZE_LEAK_LOG=true \
> 	make SANITIZE=leak test
> 
> I.e. mark tests as leak-free as we fix the leaks.
> 
> In 17/17 I replace uses of UNLEAK() where we can just as easily free()
> instead, i.e. most of it's built-ins doing UNLEAK(x) instead of
> strbuf_release(&x) etc.
> 
> As 17/17 notes I still think these's a place for unleak (some of the
> remaining ones are quite tricky), but that we gain more from leaving
> it for those tricky cases. Before this series we have 28 uses of
> UNLEAK(), after it's 15.
> 
> Ævar Arnfjörð Bjarmason (17):
>    tests: mark tests as passing with SANITIZE=leak
>    {reset,merge}: call discard_index() before returning
>    commit: discard partial cache before (re-)reading it
>    read-cache.c: clear and free "sparse_checkout_patterns"
>    dir.c: free "ident" and "exclude_per_dir" in "struct untracked_cache"
>    built-ins & libs & helpers: add/move destructors, fix leaks
>    unpack-file: fix ancient leak in create_temp_file()
>    revision API: call graph_clear() in release_revisions()
>    ls-files: fix a --with-tree memory leak
>    sequencer.c: fix "opts->strategy" leak in read_strategy_opts()
>    connected.c: free the "struct packed_git"
>    sequencer.c: fix a pick_commits() leak
>    rebase: don't leak on "--abort"
>    sequencer.c: fix sequencer_continue() leak
>    cherry-pick: free "struct replay_opts" members
>    revert: fix parse_options_concat() leak
>    built-ins: use free() not UNLEAK() if trivial, rm dead code
> 
>   builtin/add.c                            |  2 +-
>   builtin/bugreport.c                      |  9 +++--
>   builtin/checkout.c                       |  2 ++
>   builtin/commit.c                         | 13 +++++---
>   builtin/config.c                         | 42 +++++++++++-------------
>   builtin/diff.c                           |  2 +-
>   builtin/ls-files.c                       |  1 +
>   builtin/merge.c                          |  1 +
>   builtin/rebase.c                         |  4 +++
>   builtin/repack.c                         |  2 +-
>   builtin/reset.c                          |  2 ++
>   builtin/rev-parse.c                      |  1 +
>   builtin/revert.c                         |  4 +++
>   builtin/stash.c                          |  2 ++
>   builtin/unpack-file.c                    |  1 +
>   builtin/worktree.c                       |  7 ++--
>   connected.c                              |  6 +++-
>   dir.c                                    | 10 ++++--
>   dir.h                                    |  1 +
>   read-cache.c                             |  5 +++
>   ref-filter.c                             |  1 +
>   revision.c                               |  1 +
>   sequencer.c                              | 12 +++++--
>   t/helper/test-fake-ssh.c                 |  1 +
>   t/t0068-for-each-repo.sh                 |  1 +
>   t/t0070-fundamental.sh                   |  1 +
>   t/t1011-read-tree-sparse-checkout.sh     |  1 +
>   t/t1022-read-tree-partial-clone.sh       |  2 +-
>   t/t1404-update-ref-errors.sh             |  2 ++
>   t/t1409-avoid-packing-refs.sh            |  1 +
>   t/t1413-reflog-detach.sh                 |  1 +
>   t/t1501-work-tree.sh                     |  2 ++
>   t/t2012-checkout-last.sh                 |  1 +
>   t/t2018-checkout-branch.sh               |  1 +
>   t/t2025-checkout-no-overlay.sh           |  1 +
>   t/t3009-ls-files-others-nonsubmodule.sh  |  1 +
>   t/t3010-ls-files-killed-modified.sh      |  2 ++
>   t/t3050-subprojects-fetch.sh             |  1 +
>   t/t3060-ls-files-with-tree.sh            |  2 ++
>   t/t3409-rebase-environ.sh                |  1 +
>   t/t3413-rebase-hook.sh                   |  1 +
>   t/t3428-rebase-signoff.sh                |  1 +
>   t/t3429-rebase-edit-todo.sh              |  1 +
>   t/t3433-rebase-across-mode-change.sh     |  1 +
>   t/t4015-diff-whitespace.sh               |  4 +--
>   t/t4045-diff-relative.sh                 |  2 ++
>   t/t4052-stat-output.sh                   |  1 +
>   t/t4053-diff-no-index.sh                 |  1 +
>   t/t4067-diff-partial-clone.sh            |  1 +
>   t/t4111-apply-subdir.sh                  |  1 +
>   t/t4135-apply-weird-filenames.sh         |  1 +
>   t/t4213-log-tabexpand.sh                 |  1 +
>   t/t5544-pack-objects-hook.sh             |  2 ++
>   t/t5554-noop-fetch-negotiator.sh         |  2 ++
>   t/t5610-clone-detached.sh                |  1 +
>   t/t5611-clone-config.sh                  |  1 +
>   t/t5614-clone-submodules-shallow.sh      |  1 +
>   t/t5617-clone-submodules-remote.sh       |  1 +
>   t/t5618-alternate-refs.sh                |  2 ++
>   t/t6060-merge-index.sh                   |  2 ++
>   t/t6301-for-each-ref-errors.sh           |  1 +
>   t/t6401-merge-criss-cross.sh             |  2 ++
>   t/t6406-merge-attr.sh                    |  1 +
>   t/t6407-merge-binary.sh                  |  1 +
>   t/t6415-merge-dir-to-symlink.sh          |  1 +
>   t/t6435-merge-sparse.sh                  |  1 +
>   t/t7103-reset-bare.sh                    |  2 +-
>   t/t7504-commit-msg-hook.sh               |  1 +
>   t/t7517-per-repo-email.sh                |  1 +
>   t/t7520-ignored-hook-warning.sh          |  1 +
>   t/t7605-merge-resolve.sh                 |  1 +
>   t/t7614-merge-signoff.sh                 |  1 +
>   t/t9003-help-autocorrect.sh              |  2 ++
>   t/t9115-git-svn-dcommit-funky-renames.sh |  1 -
>   t/t9146-git-svn-empty-dirs.sh            |  1 -
>   t/t9148-git-svn-propset.sh               |  1 -
>   t/t9160-git-svn-preserve-empty-dirs.sh   |  1 -
>   77 files changed, 150 insertions(+), 51 deletions(-)
>
Ævar Arnfjörð Bjarmason Nov. 5, 2022, 12:46 p.m. UTC | #2
On Fri, Nov 04 2022, Phillip Wood wrote:

> On 03/11/2022 17:05, Ævar Arnfjörð Bjarmason wrote:
>> With the very minor exceptions of:
>> * 03-04/17 (which need trivial oilerplate)
>> * 05/17 (need to add trivial control flow to a free_*() function)
>> * 12/17 (narrowing scope of allocation)
>
> I've only looked at the rebase related patches. I'd really appreciate
> it if you could drop patches 12 & 14 as they conflict with [1] that
> fixes these issues by removing the setenv() calls.

Sure, sounds good to me.

I see Taylor queued it up like that, and the combination of the two
passes with the "true" and "check" mode leak checking modes.

For context: I saw that you planned to fix those in some follow-up
topic, but had this mostly ready before the new leak in the recent topic
showed up, and that leak had big knock-on effects in what test files I
could mark as passing.

So I figured I'd include some more more narrow fixes, but I'm even
happier to see the root cause addressed.
Phillip Wood Nov. 7, 2022, 9:46 a.m. UTC | #3
On 05/11/2022 12:46, Ævar Arnfjörð Bjarmason wrote:
> 
> On Fri, Nov 04 2022, Phillip Wood wrote:
> 
>> On 03/11/2022 17:05, Ævar Arnfjörð Bjarmason wrote:
>>> With the very minor exceptions of:
>>> * 03-04/17 (which need trivial oilerplate)
>>> * 05/17 (need to add trivial control flow to a free_*() function)
>>> * 12/17 (narrowing scope of allocation)
>>
>> I've only looked at the rebase related patches. I'd really appreciate
>> it if you could drop patches 12 & 14 as they conflict with [1] that
>> fixes these issues by removing the setenv() calls.
> 
> Sure, sounds good to me.

Thanks

> I see Taylor queued it up like that, and the combination of the two
> passes with the "true" and "check" mode leak checking modes.

That's great

Best Wishes

Phillip


> For context: I saw that you planned to fix those in some follow-up
> topic, but had this mostly ready before the new leak in the recent topic
> showed up, and that leak had big knock-on effects in what test files I
> could mark as passing.
> 
> So I figured I'd include some more more narrow fixes, but I'm even
> happier to see the root cause addressed.