From: Patrick Steinhardt <ps@pks.im>
To: git@vger.kernel.org
Cc: Eric Sunshine <sunshine@sunshineco.com>,
Junio C Hamano <gitster@pobox.com>,
Karthik Nayak <karthik.188@gmail.com>, Jeff King <peff@peff.net>
Subject: [PATCH v3 00/21] Various memory leak fixes
Date: Mon, 27 May 2024 13:45:42 +0200 [thread overview]
Message-ID: <cover.1716810168.git.ps@pks.im> (raw)
In-Reply-To: <cover.1716465556.git.ps@pks.im>
[-- Attachment #1: Type: text/plain, Size: 13440 bytes --]
Hi,
this is the third version of my patch series that fixes various memory
leaks throughout Git.
Changes compared to v2:
- Add a missing SOB.
- Fix some typos in commit messages.
- Explain more thoroughly why `appendwholeline()` may leak even on
error.
- Move removal of `const char **` cast to the correct commit.
Thanks!
Patrick
Patrick Steinhardt (21):
ci: add missing dependency for TTY prereq
t: mark a bunch of tests as leak-free
transport-helper: fix leaking helper name
strbuf: fix leak when `appendwholeline()` fails with EOF
checkout: clarify memory ownership in `unique_tracking_name()`
http: refactor code to clarify memory ownership
config: clarify memory ownership in `git_config_pathname()`
diff: refactor code to clarify memory ownership of prefixes
convert: refactor code to clarify ownership of
check_roundtrip_encoding
builtin/log: stop using globals for log config
builtin/log: stop using globals for format config
config: clarify memory ownership in `git_config_string()`
config: plug various memory leaks
builtin/credential: clear credential before exit
commit-reach: fix memory leak in `ahead_behind()`
submodule: fix leaking memory for submodule entries
strvec: add functions to replace and remove strings
builtin/mv: refactor `add_slash()` to always return allocated strings
builtin/mv duplicate string list memory
builtin/mv: refactor to use `struct strvec`
builtin/mv: fix leaks for submodule gitfile paths
Makefile | 1 +
alias.c | 6 +-
attr.c | 2 +-
attr.h | 2 +-
builtin/blame.c | 2 +-
builtin/checkout.c | 14 +-
builtin/commit.c | 4 +-
builtin/config.c | 2 +-
builtin/credential.c | 2 +
builtin/log.c | 708 ++++++++++--------
builtin/merge.c | 4 +-
builtin/mv.c | 222 +++---
builtin/rebase.c | 2 +-
builtin/receive-pack.c | 6 +-
builtin/repack.c | 8 +-
builtin/worktree.c | 20 +-
checkout.c | 4 +-
checkout.h | 6 +-
ci/install-dependencies.sh | 4 +-
commit-reach.c | 4 +
config.c | 52 +-
config.h | 10 +-
convert.c | 30 +-
convert.h | 2 +-
delta-islands.c | 2 +-
diff.c | 20 +-
environment.c | 16 +-
environment.h | 14 +-
fetch-pack.c | 4 +-
fsck.c | 4 +-
fsmonitor-settings.c | 5 +-
gpg-interface.c | 6 +-
http.c | 50 +-
imap-send.c | 12 +-
mailmap.c | 4 +-
mailmap.h | 4 +-
merge-ll.c | 6 +-
pager.c | 2 +-
pretty.c | 14 +-
promisor-remote.h | 2 +-
remote.c | 20 +-
remote.h | 8 +-
sequencer.c | 2 +-
setup.c | 6 +-
strbuf.c | 4 +-
strvec.c | 20 +
strvec.h | 13 +
submodule-config.c | 2 +
t/t0300-credentials.sh | 2 +
t/t0411-clone-from-partial.sh | 1 +
t/t0610-reftable-basics.sh | 1 +
t/t0611-reftable-httpd.sh | 1 +
t/t1013-read-tree-submodule.sh | 1 +
t/t1306-xdg-files.sh | 1 +
t/t1350-config-hooks-path.sh | 1 +
t/t1400-update-ref.sh | 2 +
t/t2013-checkout-submodule.sh | 1 +
t/t2024-checkout-dwim.sh | 1 +
t/t2060-switch.sh | 1 +
t/t2405-worktree-submodule.sh | 1 +
t/t3007-ls-files-recurse-submodules.sh | 1 +
t/t3203-branch-output.sh | 2 +
t/t3415-rebase-autosquash.sh | 1 +
t/t3426-rebase-submodule.sh | 1 +
t/t3512-cherry-pick-submodule.sh | 1 +
t/t3513-revert-submodule.sh | 1 +
t/t3600-rm.sh | 1 +
t/t3906-stash-submodule.sh | 1 +
t/t4001-diff-rename.sh | 4 +-
t/t4041-diff-submodule-option.sh | 1 +
t/t4043-diff-rename-binary.sh | 1 +
t/t4059-diff-submodule-not-initialized.sh | 1 +
t/t4060-diff-submodule-option-diff-format.sh | 1 +
t/t4120-apply-popt.sh | 1 +
t/t4137-apply-submodule.sh | 1 +
t/t4210-log-i18n.sh | 2 +
t/t5563-simple-http-auth.sh | 1 +
t/t5564-http-proxy.sh | 1 +
t/t5581-http-curl-verbose.sh | 1 +
t/t6006-rev-list-format.sh | 1 +
t/t6041-bisect-submodule.sh | 1 +
t/t6400-merge-df.sh | 1 +
t/t6412-merge-large-rename.sh | 1 +
t/t6426-merge-skip-unneeded-updates.sh | 1 +
t/t6429-merge-sequence-rename-caching.sh | 1 +
t/t6438-submodule-directory-file-conflicts.sh | 1 +
t/t7001-mv.sh | 2 +
t/t7005-editor.sh | 1 +
t/t7102-reset.sh | 1 +
t/t7112-reset-submodule.sh | 1 +
t/t7417-submodule-path-url.sh | 1 +
t/t7421-submodule-summary-add.sh | 1 +
t/t7423-submodule-symlinks.sh | 1 +
t/t9129-git-svn-i18n-commitencoding.sh | 1 -
t/t9139-git-svn-non-utf8-commitencoding.sh | 1 -
t/t9200-git-cvsexportcommit.sh | 1 +
t/t9401-git-cvsserver-crlf.sh | 1 +
t/t9600-cvsimport.sh | 1 +
t/t9601-cvsimport-vendor-branch.sh | 1 +
t/t9602-cvsimport-branches-tags.sh | 1 +
t/t9603-cvsimport-patchsets.sh | 2 +
t/t9604-cvsimport-timestamps.sh | 2 +
t/unit-tests/t-strvec.c | 269 +++++++
t/unit-tests/test-lib.c | 13 +
t/unit-tests/test-lib.h | 13 +
transport-helper.c | 6 +-
transport.c | 1 +
upload-pack.c | 2 +-
userdiff.h | 12 +-
109 files changed, 1151 insertions(+), 586 deletions(-)
create mode 100644 t/unit-tests/t-strvec.c
Range-diff against v2:
1: 857b8b14ce ! 1: ded220a06b ci: add missing dependency for TTY prereq
@@ Commit message
systems are missing this dependency and thus don't execute those tests
at all. Fix this.
+ Signed-off-by: Patrick Steinhardt <ps@pks.im>
+
## ci/install-dependencies.sh ##
@@ ci/install-dependencies.sh: alpine-*)
apk add --update shadow sudo build-base curl-dev openssl-dev expat-dev gettext \
2: ceade7dbba ! 2: f305e4bc46 t: mark a bunch of tests as leak-free
@@ Commit message
- t7423: Introduced via b20c10fd9b (t7423: add tests for symlinked
submodule directories, 2024-01-28), passes since e8d0608944
(submodule: require the submodule path to contain directories only,
- 2024-03-26). The fix is not ovbiously related, but probably works
+ 2024-03-26). The fix is not obviously related, but probably works
because we now die early in many code paths.
- t9xxx: All of these are exercising CVS-related tooling and pass
since at least Git v2.40. It's likely that these pass for a long
- time already, but nobody ever noticed because noone has CVS on their
- machine.
+ time already, but nobody ever noticed because Git developers do not
+ tend to have CVS on their machines.
Mark all of these tests as passing.
3: a96b5ac359 = 3: 9e946c1a83 transport-helper: fix leaking helper name
4: 9dd8709d1b ! 4: aa5cbd9d14 strbuf: fix leak when `appendwholeline()` fails with EOF
@@ Commit message
In `strbuf_appendwholeline()` we call `strbuf_getwholeline()` with a
temporary buffer. In case the call returns an error we indicate this by
- returning EOF, but never release the temporary buffer. This can lead to
- a memory leak when the line has been partially filled. Fix this.
+ returning EOF, but never release the temporary buffer. This can cause a
+ leak though because `strbuf_getwholeline()` calls getline(3). Quoting
+ its documentation:
+
+ If *lineptr was set to NULL before the call, then the buffer
+ should be freed by the user program even on failure.
+
+ Consequently, the temporary buffer may hold allocated memory even when
+ the call to `strbuf_getwholeline()` fails.
+
+ Fix this by releasing the temporary buffer on error.
Signed-off-by: Patrick Steinhardt <ps@pks.im>
5: 6d4e9ce706 = 5: 4a6dd9b6a8 checkout: clarify memory ownership in `unique_tracking_name()`
6: 141cae2de1 = 6: fa91a3942e http: refactor code to clarify memory ownership
7: ff5e761e55 = 7: 88babf1abf config: clarify memory ownership in `git_config_pathname()`
8: afe69c7303 = 8: feec7e971f diff: refactor code to clarify memory ownership of prefixes
9: eb7fce55b0 = 9: dae00f1b63 convert: refactor code to clarify ownership of check_roundtrip_encoding
10: ee2fcf388c = 10: 02c5be27be builtin/log: stop using globals for log config
11: 3490ad3a02 = 11: eeba79678a builtin/log: stop using globals for format config
12: 6cfc28c7e2 ! 12: a4fafcd079 config: clarify memory ownership in `git_config_string()`
@@ config.c: int git_config_bool(const char *name, const char *value)
{
if (!value)
return config_error_nonbool(var);
+@@ config.c: static int git_default_core_config(const char *var, const char *value,
+
+ if (!strcmp(var, "core.checkroundtripencoding")) {
+ FREE_AND_NULL(check_roundtrip_encoding);
+- return git_config_string((const char **) &check_roundtrip_encoding, var, value);
++ return git_config_string(&check_roundtrip_encoding, var, value);
+ }
+
+ if (!strcmp(var, "core.notesref")) {
@@ config.c: int git_configset_get_string(struct config_set *set, const char *key, char **des
{
const char *value;
13: 70e8e26513 ! 13: 8b74dff678 config: plug various memory leaks
@@ config.c: static int git_default_core_config(const char *var, const char *value,
return git_config_pathname(&git_hooks_path, var, value);
}
-@@ config.c: static int git_default_core_config(const char *var, const char *value,
-
- if (!strcmp(var, "core.checkroundtripencoding")) {
- FREE_AND_NULL(check_roundtrip_encoding);
-- return git_config_string((const char **) &check_roundtrip_encoding, var, value);
-+ return git_config_string(&check_roundtrip_encoding, var, value);
- }
-
- if (!strcmp(var, "core.notesref")) {
@@ config.c: static int git_default_core_config(const char *var, const char *value,
return 0;
}
14: f1a1c43e76 = 14: 265665fe6c builtin/credential: clear credential before exit
15: 64b92156f8 = 15: b315a5bb5c commit-reach: fix memory leak in `ahead_behind()`
16: cd8a992f08 = 16: 7c75a94756 submodule: fix leaking memory for submodule entries
17: 128e2eaf7a = 17: 0f61ee9929 strvec: add functions to replace and remove strings
18: 1310b24fc2 = 18: 1830e2a568 builtin/mv: refactor `add_slash()` to always return allocated strings
19: d4fef9825a = 19: 9eeafac365 builtin/mv duplicate string list memory
20: 797cdb286a = 20: 48b9d3e343 builtin/mv: refactor to use `struct strvec`
21: 095469193c = 21: add7946446 builtin/mv: fix leaks for submodule gitfile paths
--
2.45.1.246.gb9cfe4845c.dirty
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
next prev parent reply other threads:[~2024-05-27 11:45 UTC|newest]
Thread overview: 115+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-05-23 12:25 [PATCH 00/20] Various memory leak fixes Patrick Steinhardt
2024-05-23 12:25 ` [PATCH 01/20] t: mark a bunch of tests as leak-free Patrick Steinhardt
2024-05-23 17:44 ` Junio C Hamano
2024-05-24 6:56 ` Patrick Steinhardt
2024-05-24 16:05 ` Junio C Hamano
2024-05-24 17:53 ` Junio C Hamano
2024-05-24 20:34 ` Karthik Nayak
2024-05-23 12:25 ` [PATCH 02/20] transport-helper: fix leaking helper name Patrick Steinhardt
2024-05-23 17:36 ` Junio C Hamano
2024-05-24 20:38 ` Karthik Nayak
2024-05-23 12:25 ` [PATCH 03/20] strbuf: fix leak when `appendwholeline()` fails with EOF Patrick Steinhardt
2024-05-23 12:25 ` [PATCH 04/20] checkout: clarify memory ownership in `unique_tracking_name()` Patrick Steinhardt
2024-05-23 12:25 ` [PATCH 05/20] http: refactor code to clarify memory ownership Patrick Steinhardt
2024-05-23 12:25 ` [PATCH 06/20] config: clarify memory ownership in `git_config_pathname()` Patrick Steinhardt
2024-05-23 12:25 ` [PATCH 07/20] diff: refactor code to clarify memory ownership of prefixes Patrick Steinhardt
2024-05-23 16:59 ` Eric Sunshine
2024-05-23 12:25 ` [PATCH 08/20] convert: refactor code to clarify ownership of check_roundtrip_encoding Patrick Steinhardt
2024-05-23 12:25 ` [PATCH 09/20] builtin/log: stop using globals for log config Patrick Steinhardt
2024-05-23 12:25 ` [PATCH 10/20] builtin/log: stop using globals for format config Patrick Steinhardt
2024-05-23 12:26 ` [PATCH 11/20] config: clarify memory ownership in `git_config_string()` Patrick Steinhardt
2024-05-23 12:26 ` [PATCH 12/20] config: plug various memory leaks Patrick Steinhardt
2024-05-23 17:13 ` Junio C Hamano
2024-05-24 6:58 ` Patrick Steinhardt
2024-05-24 8:55 ` Patrick Steinhardt
2024-05-24 16:12 ` Junio C Hamano
2024-05-24 16:11 ` Junio C Hamano
2024-05-23 12:26 ` [PATCH 13/20] builtin/credential: clear credential before exit Patrick Steinhardt
2024-05-23 12:26 ` [PATCH 14/20] commit-reach: fix memory leak in `ahead_behind()` Patrick Steinhardt
2024-05-23 12:26 ` [PATCH 15/20] submodule: fix leaking memory for submodule entries Patrick Steinhardt
2024-05-23 12:26 ` [PATCH 16/20] strvec: add functions to replace and remove strings Patrick Steinhardt
2024-05-23 17:09 ` Eric Sunshine
2024-05-24 6:56 ` Patrick Steinhardt
2024-05-23 12:26 ` [PATCH 17/20] builtin/mv: refactor `add_slash()` to always return allocated strings Patrick Steinhardt
2024-05-23 12:26 ` [PATCH 18/20] builtin/mv duplicate string list memory Patrick Steinhardt
2024-05-23 12:26 ` [PATCH 19/20] builtin/mv: refactor to use `struct strvec` Patrick Steinhardt
2024-05-23 12:26 ` [PATCH 20/20] builtin/mv: fix leaks for submodule gitfile paths Patrick Steinhardt
2024-05-23 16:45 ` [PATCH 00/20] Various memory leak fixes Junio C Hamano
2024-05-24 6:56 ` Patrick Steinhardt
2024-05-24 10:03 ` [PATCH v2 00/21] " Patrick Steinhardt
2024-05-24 10:03 ` [PATCH v2 01/21] ci: add missing dependency for TTY prereq Patrick Steinhardt
2024-05-24 16:31 ` Junio C Hamano
2024-05-24 10:03 ` [PATCH v2 02/21] t: mark a bunch of tests as leak-free Patrick Steinhardt
2024-05-24 10:03 ` [PATCH v2 03/21] transport-helper: fix leaking helper name Patrick Steinhardt
2024-05-24 10:03 ` [PATCH v2 04/21] strbuf: fix leak when `appendwholeline()` fails with EOF Patrick Steinhardt
2024-05-25 4:46 ` Jeff King
2024-05-27 6:44 ` Patrick Steinhardt
2024-05-29 9:16 ` Jeff King
2024-05-29 11:25 ` Patrick Steinhardt
2024-05-30 7:16 ` Jeff King
2024-05-24 10:03 ` [PATCH v2 05/21] checkout: clarify memory ownership in `unique_tracking_name()` Patrick Steinhardt
2024-05-24 10:03 ` [PATCH v2 06/21] http: refactor code to clarify memory ownership Patrick Steinhardt
2024-05-24 10:03 ` [PATCH v2 07/21] config: clarify memory ownership in `git_config_pathname()` Patrick Steinhardt
2024-05-24 10:03 ` [PATCH v2 08/21] diff: refactor code to clarify memory ownership of prefixes Patrick Steinhardt
2024-05-24 10:03 ` [PATCH v2 09/21] convert: refactor code to clarify ownership of check_roundtrip_encoding Patrick Steinhardt
2024-05-24 10:03 ` [PATCH v2 10/21] builtin/log: stop using globals for log config Patrick Steinhardt
2024-05-24 10:04 ` [PATCH v2 11/21] builtin/log: stop using globals for format config Patrick Steinhardt
2024-05-24 10:04 ` [PATCH v2 12/21] config: clarify memory ownership in `git_config_string()` Patrick Steinhardt
2024-05-24 10:04 ` [PATCH v2 13/21] config: plug various memory leaks Patrick Steinhardt
2024-05-24 10:13 ` Patrick Steinhardt
2024-05-25 4:33 ` Jeff King
2024-05-27 6:46 ` Patrick Steinhardt
2024-05-29 9:20 ` Jeff King
2024-05-24 10:04 ` [PATCH v2 14/21] builtin/credential: clear credential before exit Patrick Steinhardt
2024-05-24 10:04 ` [PATCH v2 15/21] commit-reach: fix memory leak in `ahead_behind()` Patrick Steinhardt
2024-05-24 10:04 ` [PATCH v2 16/21] submodule: fix leaking memory for submodule entries Patrick Steinhardt
2024-05-24 10:04 ` [PATCH v2 17/21] strvec: add functions to replace and remove strings Patrick Steinhardt
2024-05-24 10:04 ` [PATCH v2 18/21] builtin/mv: refactor `add_slash()` to always return allocated strings Patrick Steinhardt
2024-05-24 10:04 ` [PATCH v2 19/21] builtin/mv duplicate string list memory Patrick Steinhardt
2024-05-24 10:04 ` [PATCH v2 20/21] builtin/mv: refactor to use `struct strvec` Patrick Steinhardt
2024-05-24 10:04 ` [PATCH v2 21/21] builtin/mv: fix leaks for submodule gitfile paths Patrick Steinhardt
2024-05-25 2:10 ` [PATCH v2 00/21] Various memory leak fixes Junio C Hamano
2024-05-27 6:44 ` Patrick Steinhardt
2024-05-27 17:38 ` Junio C Hamano
2024-05-27 18:02 ` Junio C Hamano
2024-05-28 5:09 ` Patrick Steinhardt
2024-05-29 8:25 ` Karthik Nayak
2024-05-27 11:45 ` Patrick Steinhardt [this message]
2024-05-27 11:45 ` [PATCH v3 01/21] ci: add missing dependency for TTY prereq Patrick Steinhardt
2024-05-27 11:45 ` [PATCH v3 02/21] t: mark a bunch of tests as leak-free Patrick Steinhardt
2024-05-27 11:45 ` [PATCH v3 03/21] transport-helper: fix leaking helper name Patrick Steinhardt
2024-05-27 11:46 ` [PATCH v3 04/21] strbuf: fix leak when `appendwholeline()` fails with EOF Patrick Steinhardt
2024-05-27 11:46 ` [PATCH v3 05/21] checkout: clarify memory ownership in `unique_tracking_name()` Patrick Steinhardt
2024-05-27 11:46 ` [PATCH v3 06/21] http: refactor code to clarify memory ownership Patrick Steinhardt
2024-05-27 11:46 ` [PATCH v3 07/21] config: clarify memory ownership in `git_config_pathname()` Patrick Steinhardt
2024-05-27 11:46 ` [PATCH v3 08/21] diff: refactor code to clarify memory ownership of prefixes Patrick Steinhardt
2024-05-27 11:46 ` [PATCH v3 09/21] convert: refactor code to clarify ownership of check_roundtrip_encoding Patrick Steinhardt
2024-05-27 11:46 ` [PATCH v3 10/21] builtin/log: stop using globals for log config Patrick Steinhardt
2024-05-27 11:46 ` [PATCH v3 11/21] builtin/log: stop using globals for format config Patrick Steinhardt
2024-05-27 11:46 ` [PATCH v3 12/21] config: clarify memory ownership in `git_config_string()` Patrick Steinhardt
2024-05-27 11:46 ` [PATCH v3 13/21] config: plug various memory leaks Patrick Steinhardt
2024-05-27 11:46 ` [PATCH v3 14/21] builtin/credential: clear credential before exit Patrick Steinhardt
2024-05-27 11:46 ` [PATCH v3 15/21] commit-reach: fix memory leak in `ahead_behind()` Patrick Steinhardt
2024-05-27 11:46 ` [PATCH v3 16/21] submodule: fix leaking memory for submodule entries Patrick Steinhardt
2024-05-27 11:47 ` [PATCH v3 17/21] strvec: add functions to replace and remove strings Patrick Steinhardt
2024-05-27 11:47 ` [PATCH v3 18/21] builtin/mv: refactor `add_slash()` to always return allocated strings Patrick Steinhardt
2024-05-27 11:47 ` [PATCH v3 19/21] builtin/mv duplicate string list memory Patrick Steinhardt
2024-05-27 11:47 ` [PATCH v3 20/21] builtin/mv: refactor to use `struct strvec` Patrick Steinhardt
2024-05-27 11:47 ` [PATCH v3 21/21] builtin/mv: fix leaks for submodule gitfile paths Patrick Steinhardt
2024-05-27 17:52 ` [PATCH v3 00/21] Various memory leak fixes Junio C Hamano
2024-05-30 6:38 ` [PATCH 0/5] add-ons for ps/leakfixes Jeff King
2024-05-30 6:39 ` [PATCH 1/5] t-strvec: use va_end() to match va_start() Jeff King
2024-05-30 6:39 ` [PATCH 2/5] t-strvec: mark variable-arg helper with LAST_ARG_MUST_BE_NULL Jeff King
2024-05-30 6:44 ` [PATCH 3/5] mv: move src_dir cleanup to end of cmd_mv() Jeff King
2024-05-30 7:04 ` Patrick Steinhardt
2024-05-30 7:21 ` Jeff King
2024-05-30 7:24 ` Patrick Steinhardt
2024-05-30 8:15 ` Jeff King
2024-05-30 8:19 ` Patrick Steinhardt
2024-05-30 8:28 ` Jeff King
2024-05-30 6:45 ` [PATCH 4/5] mv: factor out empty src_dir removal Jeff King
2024-05-30 6:46 ` [PATCH 5/5] mv: replace src_dir with a strvec Jeff King
2024-05-30 15:36 ` Junio C Hamano
2024-05-31 11:12 ` Jeff King
2024-05-31 14:56 ` Junio C Hamano
2024-05-30 7:05 ` [PATCH 0/5] add-ons for ps/leakfixes Patrick Steinhardt
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.1716810168.git.ps@pks.im \
--to=ps@pks.im \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=karthik.188@gmail.com \
--cc=peff@peff.net \
--cc=sunshine@sunshineco.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.