From: Patrick Steinhardt <ps@pks.im>
To: git@vger.kernel.org
Cc: Taylor Blau <me@ttaylorr.com>, Toon Claes <toon@iotcl.com>,
Kristoffer Haugsbakk <kristofferhaugsbakk@fastmail.com>,
Justin Tobler <jltobler@gmail.com>
Subject: [PATCH v3 00/22] Memory leak fixes (pt.9)
Date: Tue, 5 Nov 2024 07:16:40 +0100 [thread overview]
Message-ID: <cover.1730786195.git.ps@pks.im> (raw)
In-Reply-To: <cover.1728624670.git.ps@pks.im>
Hi,
this is the third revision of my 9th series of memory leak fixes.
Changes compared to v2:
- Remove an unnecessary cast.
- Fix a duplicate newline.
- Polish a couple of commit messages.
Thanks!
Patrick
Patrick Steinhardt (22):
builtin/ls-remote: plug leaking server options
t/helper: fix leaks in "reach" test tool
grep: fix leak in `grep_splice_or()`
builtin/grep: fix leak with `--max-count=0`
revision: fix leaking bloom filters
diff-lib: fix leaking diffopts in `do_diff_cache()`
pretty: clear signature check
upload-pack: fix leaking URI protocols
builtin/commit: fix leaking change data contents
trailer: fix leaking trailer values
trailer: fix leaking strbufs when formatting trailers
builtin/commit: fix leaking cleanup config
transport-helper: fix leaking import/export marks
builtin/tag: fix leaking key ID on failure to sign
combine-diff: fix leaking lost lines
dir: release untracked cache data
sparse-index: correctly free EWAH contents
t/helper: stop re-initialization of `the_repository`
t/helper: fix leaking buffer in "dump-untracked-cache"
dir: fix leak when parsing "status.showUntrackedFiles"
builtin/merge: release output buffer after performing merge
list-objects-filter-options: work around reported leak on error
builtin/commit.c | 26 +++++++++++++++++------
builtin/grep.c | 13 +++++++++---
builtin/ls-remote.c | 1 +
builtin/merge.c | 1 +
builtin/tag.c | 2 +-
combine-diff.c | 5 +++--
diff-lib.c | 1 +
dir.c | 12 +++++++++--
grep.c | 1 +
list-objects-filter-options.c | 17 ++++++---------
pretty.c | 1 +
revision.c | 5 +++++
sparse-index.c | 7 ++++--
t/helper/test-dump-untracked-cache.c | 2 ++
t/helper/test-reach.c | 10 +++++++++
t/helper/test-read-cache.c | 2 --
t/t4038-diff-combined.sh | 1 +
t/t4202-log.sh | 1 +
t/t4216-log-bloom.sh | 1 +
t/t5702-protocol-v2.sh | 1 +
t/t5801-remote-helpers.sh | 1 +
t/t6112-rev-list-filters-objects.sh | 1 +
t/t6424-merge-unrelated-index-changes.sh | 1 +
t/t6600-test-reach.sh | 1 +
t/t7004-tag.sh | 1 +
t/t7031-verify-tag-signed-ssh.sh | 1 +
t/t7063-status-untracked-cache.sh | 1 +
t/t7500-commit-template-squash-signoff.sh | 1 +
t/t7502-commit-porcelain.sh | 1 +
t/t7510-signed-commit.sh | 1 +
t/t7513-interpret-trailers.sh | 1 +
t/t7519-status-fsmonitor.sh | 1 +
t/t7528-signed-commit-ssh.sh | 1 +
t/t7610-mergetool.sh | 1 +
t/t7810-grep.sh | 1 +
trailer.c | 22 +++++++++++++------
transport-helper.c | 2 ++
upload-pack.c | 1 +
38 files changed, 115 insertions(+), 35 deletions(-)
Range-diff against v2:
1: 89b66411354 ! 1: fbb9e68e2f2 builtin/ls-remote: plug leaking server options
@@ Metadata
## Commit message ##
builtin/ls-remote: plug leaking server options
- The server options populated via `OPT_STRING_LIST()` is never cleared,
- causing a memory leak. Plug it.
+ The list of server options populated via `OPT_STRING_LIST()` is never
+ cleared, causing a memory leak. Plug it.
This leak is exposed by t5702, but plugging it alone does not make the
whole test suite pass.
2: 1c42e194b20 = 2: 17136f4bdb3 t/helper: fix leaks in "reach" test tool
3: cb4eee37b40 ! 3: 74b21470194 grep: fix leak in `grep_splice_or()`
@@ Commit message
grep: fix leak in `grep_splice_or()`
In `grep_splice_or()` we search for the next `TRUE` node in our tree of
- grep exrpessions and replace it with the given new expression. But we
+ grep expressions and replace it with the given new expression. But we
don't free the old node, which causes a memory leak. Plug it.
This leak is exposed by t7810, but plugging it alone isn't sufficient to
4: 6b2c8842ef5 = 4: d716f93169a builtin/grep: fix leak with `--max-count=0`
5: 7527b31a28f = 5: aeb8a19d28d revision: fix leaking bloom filters
6: 60af98cb2c7 ! 6: 24d9d9b1358 diff-lib: fix leaking diffopts in `do_diff_cache()`
@@ Commit message
In `do_diff_cache()` we initialize a new `rev_info` and then overwrite
its `diffopt` with a user-provided set of options. This can leak memory
because `repo_init_revisions()` may end up allocating memory for the
- `diffopt` itself depending on the configuration. And as that field is
- overwritten we won't ever free that.
+ `diffopt` itself depending on the configuration. And since that field is
+ overwritten we won't ever free it.
Plug the memory leak by releasing the diffopts before we overwrite them.
7: 5d5f6867f91 ! 7: 58ebef7e757 pretty: clear signature check
@@ Metadata
## Commit message ##
pretty: clear signature check
- The signature check in of the formatting context is never getting
- released. Fix this to plug the resulting memory leak.
+ The signature check in the formatting context is never getting released.
+ Fix this to plug the resulting memory leak.
Signed-off-by: Patrick Steinhardt <ps@pks.im>
8: 0d503e40194 = 8: c5813079d44 upload-pack: fix leaking URI protocols
9: 9f967dfe5d5 = 9: f66fa4e0e25 builtin/commit: fix leaking change data contents
10: e3ffd59123f ! 10: dac63bae39e trailer: fix leaking trailer values
@@ trailer.c: static char *apply_command(struct conf_info *conf, const char *arg)
+ char *arg;
+
if (arg_tok->value && arg_tok->value[0]) {
-- arg = arg_tok->value;
-+ arg = (char *)arg_tok->value;
+ arg = arg_tok->value;
} else {
- if (in_tok && in_tok->value)
+@@ trailer.c: static void apply_item_command(struct trailer_item *in_tok, struct arg_item *arg
arg = xstrdup(in_tok->value);
else
arg = xstrdup("");
11: 5b851453bce ! 11: 82269e5d5be trailer: fix leaking strbufs when formatting trailers
@@ Metadata
## Commit message ##
trailer: fix leaking strbufs when formatting trailers
- We are populating, but never releasing two string buffers in
- `format_trailers()`, causing a memory leak. Plug this leak by lifting
- those buffers outside of the loop and releasing them on function return.
- This fixes the memory leaks, but also optimizes the loop as we don't
- have to reallocate the buffers on every single iteration.
+ When formatting trailer lines we iterate through each of the trailers
+ and munge their respective token/value pairs according to the trailer
+ options. When formatting a trailer that has its `item->token` pointer
+ set we perform the munging in two local buffers. In the case where we
+ figure out that the value is empty and `trim_empty` is set we just skip
+ over the trailer item. But the buffers are local to the loop and we
+ don't release their contents, leading to a memory leak.
+
+ Plug this leak by lifting the buffers outside of the loop and releasing
+ them on function return. This fixes the memory leaks, but also optimizes
+ the loop as we don't have to reallocate the buffers on every single
+ iteration.
Signed-off-by: Patrick Steinhardt <ps@pks.im>
@@ trailer.c: void format_trailers(const struct process_trailer_options *opts,
size_t origlen = out->len;
struct list_head *pos;
struct trailer_item *item;
-
-+
+@@ trailer.c: void format_trailers(const struct process_trailer_options *opts,
list_for_each(pos, trailers) {
item = list_entry(pos, struct trailer_item, list);
if (item->token) {
12: 60c3f6146f3 = 12: a627e03702e builtin/commit: fix leaking cleanup config
13: ea81cd8db86 = 13: 40e0c2a2cac transport-helper: fix leaking import/export marks
14: b700ab9079f = 14: ffa5d9eae7e builtin/tag: fix leaking key ID on failure to sign
15: 76bbcb3fe30 ! 15: 70dd0cb6933 combine-diff: fix leaking lost lines
@@ Commit message
The `cnt` variable tracks the number of lines in a patch diff. It can
happen though that there are no newlines, in which case we'd still end
up allocating our array of `sline`s. In fact, we always allocate it with
- `cnt + 2` entries. But when we loop through the array to clear it at the
- end of this function we only loop until `lno < cnt`, and thus we may not
- end up releasing whatever the two extra `sline`s contain.
+ `cnt + 2` entries: one extra entry for the deletion hunk at the end, and
+ another entry that we don't seem to ever populate at all but acts as a
+ kind of sentinel value.
- Plug this memory leak.
+ When we loop through the array to clear it at the end of this function
+ we only loop until `lno < cnt`, and thus we may not end up releasing
+ whatever the two extra `sline`s contain. While that shouldn't matter for
+ the sentinel value, it does matter for the extra deletion hunk sline.
+ Regardless of that, plug this memory leak by releasing both extra
+ entries, which makes the logic a bit easier to reason about.
+
+ While at it, fix the formatting of a local comment, which incidentally
+ also provides the necessary context for why we overallocate the `sline`
+ array.
Signed-off-by: Patrick Steinhardt <ps@pks.im>
## combine-diff.c ##
+@@ combine-diff.c: static void show_patch_diff(struct combine_diff_path *elem, int num_parent,
+ result_file.ptr = result;
+ result_file.size = result_size;
+
+- /* Even p_lno[cnt+1] is valid -- that is for the end line number
++ /*
++ * Even p_lno[cnt+1] is valid -- that is for the end line number
+ * for deletion hunk at the end.
+ */
+ CALLOC_ARRAY(sline[0].p_lno, st_mult(st_add(cnt, 2), num_parent));
@@ combine-diff.c: static void show_patch_diff(struct combine_diff_path *elem, int num_parent,
}
free(result);
16: d6b96a4012d = 16: b248f266a91 dir: release untracked cache data
17: 3aa6bac5079 = 17: 76e9a6d5792 sparse-index: correctly free EWAH contents
18: 132fe750906 = 18: 70f16486d77 t/helper: stop re-initialization of `the_repository`
19: b8b702eeb28 = 19: f056d31ca50 t/helper: fix leaking buffer in "dump-untracked-cache"
20: ad309ac1b37 = 20: 714c9286e7a dir: fix leak when parsing "status.showUntrackedFiles"
21: 5e243f9ee53 ! 21: 0ff65c1213b builtin/merge: release outbut buffer after performing merge
@@ Metadata
Author: Patrick Steinhardt <ps@pks.im>
## Commit message ##
- builtin/merge: release outbut buffer after performing merge
+ builtin/merge: release output buffer after performing merge
The `obuf` member of `struct merge_options` is used to buffer output in
some cases. In order to not discard its allocated memory we only release
22: b75376e3725 = 22: d9e122bb5db list-objects-filter-options: work around reported leak on error
--
2.47.0.229.g8f8d6eee53.dirty
next prev parent reply other threads:[~2024-11-05 6:16 UTC|newest]
Thread overview: 100+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-10-11 5:32 [PATCH 00/21] Memory leak fixes (pt.9) Patrick Steinhardt
2024-10-11 5:32 ` [PATCH 01/21] builtin/ls-remote: plug leaking server options Patrick Steinhardt
2024-10-11 5:32 ` [PATCH 02/21] t/helper: fix leaks in "reach" test tool Patrick Steinhardt
2024-10-11 5:32 ` [PATCH 03/21] grep: fix leak in `grep_splice_or()` Patrick Steinhardt
2024-10-11 5:32 ` [PATCH 04/21] builtin/grep: fix leak with `--max-count=0` Patrick Steinhardt
2024-10-11 5:32 ` [PATCH 05/21] revision: fix leaking bloom filters Patrick Steinhardt
2024-10-11 5:32 ` [PATCH 06/21] diff-lib: fix leaking diffopts in `do_diff_cache()` Patrick Steinhardt
2024-10-21 9:46 ` Kristoffer Haugsbakk
2024-10-11 5:32 ` [PATCH 07/21] pretty: clear signature check Patrick Steinhardt
2024-10-18 12:02 ` Toon Claes
2024-10-21 8:44 ` Patrick Steinhardt
2024-10-11 5:32 ` [PATCH 08/21] upload-pack: fix leaking URI protocols Patrick Steinhardt
2024-10-11 5:32 ` [PATCH 09/21] builtin/commit: fix leaking change data contents Patrick Steinhardt
2024-10-11 5:32 ` [PATCH 10/21] trailer: fix leaking trailer values Patrick Steinhardt
2024-10-18 12:03 ` Toon Claes
2024-10-21 8:44 ` Patrick Steinhardt
2024-10-11 5:32 ` [PATCH 11/21] builtin/commit: fix leaking cleanup config Patrick Steinhardt
2024-10-11 5:32 ` [PATCH 12/21] transport-helper: fix leaking import/export marks Patrick Steinhardt
2024-10-11 5:32 ` [PATCH 13/21] builtin/tag: fix leaking key ID on failure to sign Patrick Steinhardt
2024-10-11 5:32 ` [PATCH 14/21] combine-diff: fix leaking lost lines Patrick Steinhardt
2024-10-11 5:32 ` [PATCH 15/21] dir: release untracked cache data Patrick Steinhardt
2024-10-11 5:32 ` [PATCH 16/21] sparse-index: correctly free EWAH contents Patrick Steinhardt
2024-10-11 5:32 ` [PATCH 17/21] t/helper: stop re-initialization of `the_repository` Patrick Steinhardt
2024-10-11 5:33 ` [PATCH 18/21] t/helper: fix leaking buffer in "dump-untracked-cache" Patrick Steinhardt
2024-10-11 5:33 ` [PATCH 19/21] dir: fix leak when parsing "status.showUntrackedFiles" Patrick Steinhardt
2024-10-11 5:33 ` [PATCH 20/21] builtin/merge: release outbut buffer after performing merge Patrick Steinhardt
2024-10-18 12:03 ` Toon Claes
2024-10-21 8:45 ` Patrick Steinhardt
2024-10-11 5:33 ` [PATCH 21/21] list-objects-filter-options: work around reported leak on error Patrick Steinhardt
2024-10-18 12:04 ` Toon Claes
2024-10-21 8:45 ` Patrick Steinhardt
2024-10-18 21:30 ` [PATCH 00/21] Memory leak fixes (pt.9) Taylor Blau
2024-10-21 8:45 ` Patrick Steinhardt
2024-10-21 9:27 ` [PATCH v2 00/22] " Patrick Steinhardt
2024-10-21 9:28 ` [PATCH v2 01/22] builtin/ls-remote: plug leaking server options Patrick Steinhardt
2024-11-04 22:10 ` Justin Tobler
2024-11-04 22:18 ` Kristoffer Haugsbakk
2024-10-21 9:28 ` [PATCH v2 02/22] t/helper: fix leaks in "reach" test tool Patrick Steinhardt
2024-10-21 9:28 ` [PATCH v2 03/22] grep: fix leak in `grep_splice_or()` Patrick Steinhardt
2024-10-21 9:42 ` Kristoffer Haugsbakk
2024-10-21 9:28 ` [PATCH v2 04/22] builtin/grep: fix leak with `--max-count=0` Patrick Steinhardt
2024-10-21 9:28 ` [PATCH v2 05/22] revision: fix leaking bloom filters Patrick Steinhardt
2024-10-21 9:28 ` [PATCH v2 06/22] diff-lib: fix leaking diffopts in `do_diff_cache()` Patrick Steinhardt
2024-10-21 9:28 ` [PATCH v2 07/22] pretty: clear signature check Patrick Steinhardt
2024-11-04 22:15 ` Justin Tobler
2024-10-21 9:28 ` [PATCH v2 08/22] upload-pack: fix leaking URI protocols Patrick Steinhardt
2024-10-21 9:28 ` [PATCH v2 09/22] builtin/commit: fix leaking change data contents Patrick Steinhardt
2024-11-04 22:21 ` Justin Tobler
2024-10-21 9:28 ` [PATCH v2 10/22] trailer: fix leaking trailer values Patrick Steinhardt
2024-11-04 22:25 ` Justin Tobler
2024-11-05 5:54 ` Patrick Steinhardt
2024-10-21 9:28 ` [PATCH v2 11/22] trailer: fix leaking strbufs when formatting trailers Patrick Steinhardt
2024-10-21 20:58 ` Taylor Blau
2024-11-04 22:31 ` Justin Tobler
2024-11-05 5:54 ` Patrick Steinhardt
2024-10-21 9:28 ` [PATCH v2 12/22] builtin/commit: fix leaking cleanup config Patrick Steinhardt
2024-10-21 9:28 ` [PATCH v2 13/22] transport-helper: fix leaking import/export marks Patrick Steinhardt
2024-10-21 9:28 ` [PATCH v2 14/22] builtin/tag: fix leaking key ID on failure to sign Patrick Steinhardt
2024-10-21 9:28 ` [PATCH v2 15/22] combine-diff: fix leaking lost lines Patrick Steinhardt
2024-11-04 22:43 ` Justin Tobler
2024-11-05 5:55 ` Patrick Steinhardt
2024-10-21 9:28 ` [PATCH v2 16/22] dir: release untracked cache data Patrick Steinhardt
2024-10-21 9:28 ` [PATCH v2 17/22] sparse-index: correctly free EWAH contents Patrick Steinhardt
2024-10-21 9:28 ` [PATCH v2 18/22] t/helper: stop re-initialization of `the_repository` Patrick Steinhardt
2024-10-21 9:28 ` [PATCH v2 19/22] t/helper: fix leaking buffer in "dump-untracked-cache" Patrick Steinhardt
2024-10-21 9:29 ` [PATCH v2 20/22] dir: fix leak when parsing "status.showUntrackedFiles" Patrick Steinhardt
2024-10-21 9:29 ` [PATCH v2 21/22] builtin/merge: release outbut buffer after performing merge Patrick Steinhardt
2024-10-21 9:41 ` Kristoffer Haugsbakk
2024-10-21 9:29 ` [PATCH v2 22/22] list-objects-filter-options: work around reported leak on error Patrick Steinhardt
2024-10-21 9:54 ` [PATCH v2 00/22] Memory leak fixes (pt.9) Kristoffer Haugsbakk
2024-10-21 10:36 ` Patrick Steinhardt
2024-10-25 7:49 ` Toon Claes
2024-11-04 22:46 ` Justin Tobler
2024-11-05 5:55 ` Patrick Steinhardt
2024-11-05 6:16 ` Patrick Steinhardt [this message]
2024-11-05 6:16 ` [PATCH v3 01/22] builtin/ls-remote: plug leaking server options Patrick Steinhardt
2024-11-05 6:16 ` [PATCH v3 02/22] t/helper: fix leaks in "reach" test tool Patrick Steinhardt
2024-11-05 6:16 ` [PATCH v3 03/22] grep: fix leak in `grep_splice_or()` Patrick Steinhardt
2024-11-05 6:16 ` [PATCH v3 04/22] builtin/grep: fix leak with `--max-count=0` Patrick Steinhardt
2024-11-05 6:16 ` [PATCH v3 05/22] revision: fix leaking bloom filters Patrick Steinhardt
2024-11-05 6:17 ` [PATCH v3 06/22] diff-lib: fix leaking diffopts in `do_diff_cache()` Patrick Steinhardt
2024-11-05 6:17 ` [PATCH v3 07/22] pretty: clear signature check Patrick Steinhardt
2024-11-05 6:17 ` [PATCH v3 08/22] upload-pack: fix leaking URI protocols Patrick Steinhardt
2024-11-05 6:17 ` [PATCH v3 09/22] builtin/commit: fix leaking change data contents Patrick Steinhardt
2024-11-05 6:17 ` [PATCH v3 10/22] trailer: fix leaking trailer values Patrick Steinhardt
2024-11-05 6:17 ` [PATCH v3 11/22] trailer: fix leaking strbufs when formatting trailers Patrick Steinhardt
2024-11-05 6:17 ` [PATCH v3 12/22] builtin/commit: fix leaking cleanup config Patrick Steinhardt
2024-11-05 6:17 ` [PATCH v3 13/22] transport-helper: fix leaking import/export marks Patrick Steinhardt
2024-11-05 6:17 ` [PATCH v3 14/22] builtin/tag: fix leaking key ID on failure to sign Patrick Steinhardt
2024-11-05 6:17 ` [PATCH v3 15/22] combine-diff: fix leaking lost lines Patrick Steinhardt
2024-11-05 6:17 ` [PATCH v3 16/22] dir: release untracked cache data Patrick Steinhardt
2024-11-05 6:17 ` [PATCH v3 17/22] sparse-index: correctly free EWAH contents Patrick Steinhardt
2024-11-05 6:17 ` [PATCH v3 18/22] t/helper: stop re-initialization of `the_repository` Patrick Steinhardt
2024-11-05 6:17 ` [PATCH v3 19/22] t/helper: fix leaking buffer in "dump-untracked-cache" Patrick Steinhardt
2024-11-05 6:17 ` [PATCH v3 20/22] dir: fix leak when parsing "status.showUntrackedFiles" Patrick Steinhardt
2024-11-05 6:17 ` [PATCH v3 21/22] builtin/merge: release output buffer after performing merge Patrick Steinhardt
2024-11-05 6:17 ` [PATCH v3 22/22] list-objects-filter-options: work around reported leak on error Patrick Steinhardt
2024-11-05 6:51 ` [PATCH v3 00/22] Memory leak fixes (pt.9) Junio C Hamano
2024-11-05 6:52 ` Patrick Steinhardt
2024-11-05 15:27 ` Justin Tobler
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=cover.1730786195.git.ps@pks.im \
--to=ps@pks.im \
--cc=git@vger.kernel.org \
--cc=jltobler@gmail.com \
--cc=kristofferhaugsbakk@fastmail.com \
--cc=me@ttaylorr.com \
--cc=toon@iotcl.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).