Hi, this is the second version of another round of memory leak fixes. There's only a single change compared to v1, namely a revised commit message. Thanks! Patrick Patrick Steinhardt (23): builtin/help: fix dangling reference to `html_path` builtin/help: fix leaking `html_path` when reading config multiple times git: fix leaking argv when handling builtins submodule: fix leaking update strategy builtin/submodule--helper: clear child process when not running it builtin/submodule--helper: fix leaking error buffer t/helper: fix leaking subrepo in nested submodule config helper builtin/submodule--helper: fix leaking remote ref on errors dir: fix off by one errors for ignored and untracked entries builtin/pull: fix leaking "ff" option diff: fix leaking orderfile option parse-options: free previous value of `OPTION_FILENAME` diffcore-order: fix leaking buffer when parsing orderfiles builtin/repack: fix leaking configuration builtin/difftool: plug several trivial memory leaks trace2: destroy context stored in thread-local storage submodule: fix leaking submodule ODB paths grep: fix leaking grep pattern promisor-remote: fix leaking partial clone filter builtin/maintenance: fix leaking config string builtin/maintenance: fix leak in `get_schedule_cmd()` revision: fix leaking parents when simplifying commits diffcore-break: fix leaking filespecs when merging broken pairs builtin/difftool.c | 6 + builtin/gc.c | 131 +++++++++++------- builtin/help.c | 16 ++- builtin/pull.c | 11 +- builtin/repack.c | 57 ++++++-- builtin/submodule--helper.c | 26 +++- combine-diff.c | 3 +- diff.c | 7 +- diff.h | 2 +- diffcore-break.c | 4 +- diffcore-order.c | 19 +-- dir.c | 6 +- git.c | 22 ++- grep.c | 2 +- parse-options.c | 22 +-- promisor-remote.c | 2 + revision.c | 5 + submodule-config.c | 2 +- submodule.c | 9 +- submodule.h | 6 +- t/helper/test-submodule-nested-repo-config.c | 2 +- t/t0012-help.sh | 1 + t/t1414-reflog-walk.sh | 1 + ...common-prefixes-and-directory-traversal.sh | 1 + t/t4008-diff-break-rewrite.sh | 2 + t/t4022-diff-rewrite.sh | 1 + t/t4023-diff-rename-typechange.sh | 1 + t/t4031-diff-rewrite-binary.sh | 1 + t/t4056-diff-order.sh | 1 + t/t4204-patch-id.sh | 1 + t/t5310-pack-bitmaps.sh | 1 + t/t5326-multi-pack-bitmaps.sh | 2 + t/t5329-pack-objects-cruft.sh | 2 + t/t6004-rev-list-path-optim.sh | 1 + t/t6019-rev-list-ancestry-path.sh | 1 + t/t6111-rev-list-treesame.sh | 1 + t/t7061-wtstatus-ignore.sh | 1 + t/t7406-submodule-update.sh | 1 + t/t7407-submodule-foreach.sh | 1 + t/t7408-submodule-reference.sh | 2 + t/t7411-submodule-config.sh | 1 + t/t7420-submodule-set-url.sh | 1 + t/t7521-ignored-mode.sh | 1 + t/t7524-commit-summary.sh | 2 + t/t7601-merge-pull-config.sh | 1 + t/t7700-repack.sh | 1 + t/t7800-difftool.sh | 1 + t/t7814-grep-recurse-submodules.sh | 1 + t/t7900-maintenance.sh | 1 + trace2/tr2_tls.c | 10 +- 50 files changed, 279 insertions(+), 124 deletions(-) Range-diff against v1: 1: e3bed973af = 1: e3bed973af builtin/help: fix dangling reference to `html_path` 2: 4a59fe15ae = 2: 4a59fe15ae builtin/help: fix leaking `html_path` when reading config multiple times 3: ea3dd851ad = 3: ea3dd851ad git: fix leaking argv when handling builtins 4: 7cdd2691b7 = 4: 7cdd2691b7 submodule: fix leaking update strategy 5: 0d0964a2be = 5: 0d0964a2be builtin/submodule--helper: clear child process when not running it 6: 52d12e034b = 6: 52d12e034b builtin/submodule--helper: fix leaking error buffer 7: 96bd7f01d5 = 7: 96bd7f01d5 t/helper: fix leaking subrepo in nested submodule config helper 8: d088703d31 ! 8: d5e7a24aac builtin/submodule--helper: fix leaking remote ref on errors @@ Metadata ## Commit message ## builtin/submodule--helper: fix leaking remote ref on errors - When `update_submodule()` fails we return with `die_message()`. - Curiously enough, this causes a memory leak because we use the - `run_process_parallel()` interfaces here, which swap out the die - routine. + When `update_submodule()` fails we return with `die_message()`, which + only causes us to print the same message as `die()` would without + actually causing the process to die. We don't free memory in that case + and thus leak memory. Fix the leak by freeing the remote ref. 9: d5c9cccb82 = 9: fca161d389 dir: fix off by one errors for ignored and untracked entries 10: 747c9a76a2 = 10: 2338b5e2a8 builtin/pull: fix leaking "ff" option 11: 85c0f9e5f5 = 11: cb08db4d37 diff: fix leaking orderfile option 12: 330b6c52a0 = 12: 650b89bcca parse-options: free previous value of `OPTION_FILENAME` 13: c975dfe462 = 13: cd79422087 diffcore-order: fix leaking buffer when parsing orderfiles 14: a5f3931eee = 14: e015d1704b builtin/repack: fix leaking configuration 15: c79a5118e4 = 15: 7bb07ec2f0 builtin/difftool: plug several trivial memory leaks 16: 0fb3dc55e5 = 16: 30928eb8f9 trace2: destroy context stored in thread-local storage 17: f1cb8122d1 = 17: 35f5de5467 submodule: fix leaking submodule ODB paths 18: 411df7248d = 18: 3d1cece660 grep: fix leaking grep pattern 19: 690de28bef = 19: da7768bad5 promisor-remote: fix leaking partial clone filter 20: ed4091255c = 20: 0a72fc83f7 builtin/maintenance: fix leaking config string 21: 46956bd8fb = 21: 95200b8a76 builtin/maintenance: fix leak in `get_schedule_cmd()` 22: 2a23df9a68 = 22: 8e7ea54863 revision: fix leaking parents when simplifying commits 23: 57a3a9e9f8 = 23: 8cbc41425f diffcore-break: fix leaking filespecs when merging broken pairs -- 2.46.2.852.g229c0bf0e5.dirty