From: "NitroCao via GitGitGadget" <gitgitgadget@gmail.com>
To: git@vger.kernel.org
Cc: NitroCao <jaycecao520@gmail.com>, Nitro Cao <jaycecao520@gmail.com>
Subject: [PATCH v2] clone: fix segfault when using --revision and v0/v1 protocol
Date: Tue, 03 Feb 2026 11:56:13 +0000 [thread overview]
Message-ID: <pull.2185.v2.git.git.1770119773541.gitgitgadget@gmail.com> (raw)
In-Reply-To: <pull.2185.git.git.1769937818682.gitgitgadget@gmail.com>
From: Nitro Cao <jaycecao520@gmail.com>
When `git clone` is used with `--revision` and the protocol version is
v0 or v1, the client segfaults if the revision does not specify a peer
reference (e.g. `--revision master` instead of
`--revision refs/heads/master:master`).
This occurs because `update_remote_refs()` assumes that if
`remote_head_points_at` is set, `remote_head_points_at->peer_ref` is
also valid. However, for v0/v1 protocols, all references are fetched
without filtering, and if the revision lacks a peer reference,
`peer_ref` remains NULL.
Add a check for `remote_head_points_at->peer_ref` before dereferencing
it to prevent the segmentation fault.
Signed-off-by: Nitro Cao <jaycecao520@gmail.com>
---
fix(clone): segment fault when using --revision and protocol v0/v1
git clone command would segment fault when satisfying the following
conditions at the same time:
* Use HTTP protocol v0 or v1 to interact with remote servers.
* The value of --revision doesn't specify the peer reference, like
--revision master instead of --revision refs/heads/master:master
When using protocol v2, git client can use ref-prefix param of ls-refs
command to fetch wanted references based on --revision. But for protocol
v0/v1, git client just fetch all references and doesn't filter them. In
this case, the value of remote_head variable is not NULL, which leads to
the value of remote_head_points_at not NULL too. But we don't specify
the peer reference in --revsion, remote_head_points_at->peer_ref would
be NULL. So git client would boom when update_remote_refs.
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-git-2185%2FNitroCao%2Ffix%2Fsegment-fault-with-revision-param-v2
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-git-2185/NitroCao/fix/segment-fault-with-revision-param-v2
Pull-Request: https://github.com/git/git/pull/2185
Range-diff vs v1:
1: f75b1f7e2e ! 1: b3ab27f977 fix(clone): segment fault when using --revision and protocol v0/v1
@@ Metadata
Author: Nitro Cao <jaycecao520@gmail.com>
## Commit message ##
- fix(clone): segment fault when using --revision and protocol v0/v1
+ clone: fix segfault when using --revision and v0/v1 protocol
- git clone command would segment fault when satisfying the following
- conditions at the same time:
- - Use HTTP protocol v0 or v1 to interact with remote servers.
- - The value of `--revision` doesn't specify the peer reference, like
- `--revision master` instead of `--revision refs/heads/master:master`
+ When `git clone` is used with `--revision` and the protocol version is
+ v0 or v1, the client segfaults if the revision does not specify a peer
+ reference (e.g. `--revision master` instead of
+ `--revision refs/heads/master:master`).
- When using protocol v2, git client can use `ref-prefix` param of
- `ls-refs` command to fetch wanted references based on `--revision`.
- But for protocol v0/v1, git client just fetch all references and
- doesn't filter them.
- In this case, the value of `remote_head` variable is not NULL,
- which leads to the value of `remote_head_points_at` not NULL too.
- But we don't specify the peer reference in `--revsion`,
- `remote_head_points_at->peer_ref` would be NULL. So git client would
- boom when `update_remote_refs`.
+ This occurs because `update_remote_refs()` assumes that if
+ `remote_head_points_at` is set, `remote_head_points_at->peer_ref` is
+ also valid. However, for v0/v1 protocols, all references are fetched
+ without filtering, and if the revision lacks a peer reference,
+ `peer_ref` remains NULL.
+
+ Add a check for `remote_head_points_at->peer_ref` before dereferencing
+ it to prevent the segmentation fault.
Signed-off-by: Nitro Cao <jaycecao520@gmail.com>
builtin/clone.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/builtin/clone.c b/builtin/clone.c
index b40cee5968..ba8de92563 100644
--- a/builtin/clone.c
+++ b/builtin/clone.c
@@ -558,7 +558,7 @@ static void update_remote_refs(const struct ref *refs,
write_followtags(refs, msg);
}
- if (remote_head_points_at && !option_bare) {
+ if (remote_head_points_at && remote_head_points_at->peer_ref && !option_bare) {
struct strbuf head_ref = STRBUF_INIT;
strbuf_addstr(&head_ref, branch_top);
strbuf_addstr(&head_ref, "HEAD");
base-commit: 67ad42147a7acc2af6074753ebd03d904476118f
--
gitgitgadget
next prev parent reply other threads:[~2026-02-03 11:56 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-02-01 9:23 [PATCH] fix(clone): segment fault when using --revision and protocol v0/v1 NitroCao via GitGitGadget
2026-02-03 11:56 ` NitroCao via GitGitGadget [this message]
2026-02-03 19:26 ` [PATCH v2] clone: fix segfault when using --revision and v0/v1 protocol Junio C Hamano
2026-02-08 15:25 ` Nitro Cao
-- strict thread matches above, loose matches on Subject: below --
2026-02-08 14:09 [PATCH v2] clone: fix segfault when using --revision and v0/v1 protocol Jayce Cao
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=pull.2185.v2.git.git.1770119773541.gitgitgadget@gmail.com \
--to=gitgitgadget@gmail.com \
--cc=git@vger.kernel.org \
--cc=jaycecao520@gmail.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.