From: Phillip Wood <phillip.wood123@gmail.com>
To: Patrick Steinhardt <ps@pks.im>, git@vger.kernel.org
Cc: Jeff King <peff@peff.net>, Karthik Nayak <karthik.188@gmail.com>
Subject: Re: [PATCH 3/3] refs: fix segfault in `is_pseudoref()` when ref cannot be resolved
Date: Mon, 29 Apr 2024 16:25:31 +0100 [thread overview]
Message-ID: <dbe3283c-7814-48ca-af47-2246965b2794@gmail.com> (raw)
In-Reply-To: <88822afe950318c0312de5541a411942a163b139.1714398019.git.ps@pks.im>
Hi Patrick
On 29/04/2024 14:41, Patrick Steinhardt wrote:
> The `is_pseudoref()` function has somewhat weird behaviour in that it
> both checks whether a reference looks like a pseudoref, but also that
> the reference actually resolves to an object ID.
>
> In case a reference does not resolve though we can run into a segfault
> because we never initialize the local `struct object_id` variable. Thus,
> when `refs_resolve_ref_unsafe()` is unable to resolve the reference, the
> variable will stay uninitialize. We then try to look up the hash algo
s/uninitialize/uninitialized/
> via the uninitialized value when calling `is_null_oid()`, which causes
> us to segfault.
>
> It is somewhat questionable in the first place that we declare a ref to
> be a pseudorefe depending on whether it resolves to an object ID or not.
If I remember rightly Karthik added that check to avoid the files
backend calling a file with a name that matched the pseudoref syntax a
pseudoref when it wasn't actually a pseudoref.
> And to make things even worse, a symbolic ref is currently considered to
> not be a pseudo ref either because of `RRESOLVE_REF_NO_RECURSE`,
s/RR/R/
That was a deliberate choice to fit with the definition of pseudorefs
excluding symbolic refs.
> which
> will cause us to not resolve them to an object ID. Last but not least,
> it also is inconsistent with `is_headref()`, which only checks for the
> reference to exist via `refs_ref_exists()`.
>
> Refactor the code to do the same. While that still feels somewhat fishy,
> it at least fixes the segfault for now.
Alternatively we could call oidclr() when refs_resolve_refs_unsafe()
returns NULL
Best Wishes
Phillip
> I have not been able to come up
> with a reproducible test case that does not rely on other bugs and very
> intricate state.
>
> Signed-off-by: Patrick Steinhardt <ps@pks.im>
> ---
> refs.c | 17 ++++-------------
> 1 file changed, 4 insertions(+), 13 deletions(-)
>
> diff --git a/refs.c b/refs.c
> index 567c6fc6ff..b35485f150 100644
> --- a/refs.c
> +++ b/refs.c
> @@ -900,7 +900,6 @@ int is_pseudoref(struct ref_store *refs, const char *refname)
> "NOTES_MERGE_REF",
> "MERGE_AUTOSTASH",
> };
> - struct object_id oid;
> size_t i;
>
> if (!is_pseudoref_syntax(refname))
> @@ -908,20 +907,12 @@ int is_pseudoref(struct ref_store *refs, const char *refname)
> if (is_special_ref(refname))
> return 0;
>
> - if (ends_with(refname, "_HEAD")) {
> - refs_resolve_ref_unsafe(refs, refname,
> - RESOLVE_REF_READING | RESOLVE_REF_NO_RECURSE,
> - &oid, NULL);
> - return !is_null_oid(&oid);
> - }
> + if (ends_with(refname, "_HEAD"))
> + return refs_ref_exists(refs, refname);
>
> for (i = 0; i < ARRAY_SIZE(irregular_pseudorefs); i++)
> - if (!strcmp(refname, irregular_pseudorefs[i])) {
> - refs_resolve_ref_unsafe(refs, refname,
> - RESOLVE_REF_READING | RESOLVE_REF_NO_RECURSE,
> - &oid, NULL);
> - return !is_null_oid(&oid);
> - }
> + if (!strcmp(refname, irregular_pseudorefs[i]))
> + return refs_ref_exists(refs, refname);
>
> return 0;
> }
next prev parent reply other threads:[~2024-04-29 15:25 UTC|newest]
Thread overview: 93+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-04-29 13:41 [PATCH 0/3] Clarify pseudo-ref terminology Patrick Steinhardt
2024-04-29 13:41 ` [PATCH 1/3] refs: move `is_special_ref()` Patrick Steinhardt
2024-04-29 13:41 ` [PATCH 2/3] refs: do not label special refs as pseudo refs Patrick Steinhardt
2024-04-29 15:12 ` Phillip Wood
2024-04-30 7:30 ` Patrick Steinhardt
2024-04-30 9:59 ` Phillip Wood
2024-04-30 12:11 ` Patrick Steinhardt
2024-04-30 10:23 ` Jeff King
2024-04-30 12:07 ` Karthik Nayak
2024-04-30 12:33 ` Patrick Steinhardt
2024-04-30 12:16 ` Patrick Steinhardt
2024-04-29 16:24 ` Junio C Hamano
2024-04-29 22:52 ` Justin Tobler
2024-04-30 7:29 ` Patrick Steinhardt
2024-05-09 17:29 ` Jean-Noël AVILA
2024-05-10 8:33 ` Patrick Steinhardt
2024-04-29 13:41 ` [PATCH 3/3] refs: fix segfault in `is_pseudoref()` when ref cannot be resolved Patrick Steinhardt
2024-04-29 15:25 ` Phillip Wood [this message]
2024-04-29 18:57 ` Karthik Nayak
2024-04-29 19:47 ` Phillip Wood
2024-04-29 20:44 ` Karthik Nayak
2024-04-30 7:30 ` Patrick Steinhardt
2024-04-30 12:26 ` [PATCH v2 00/10] Clarify pseudo-ref terminology Patrick Steinhardt
2024-04-30 12:26 ` [PATCH v2 01/10] Documentation/glossary: redefine pseudorefs as special refs Patrick Steinhardt
2024-04-30 12:49 ` Karthik Nayak
2024-04-30 17:17 ` Justin Tobler
2024-04-30 20:12 ` Junio C Hamano
2024-05-02 8:07 ` Patrick Steinhardt
2024-04-30 12:26 ` [PATCH v2 02/10] Documentation/glossary: clarify limitations of pseudorefs Patrick Steinhardt
2024-04-30 13:35 ` Kristoffer Haugsbakk
2024-04-30 12:26 ` [PATCH v2 03/10] Documentation/glossary: define root refs as refs Patrick Steinhardt
2024-04-30 12:56 ` Karthik Nayak
2024-04-30 12:26 ` [PATCH v2 04/10] refs: rename `is_pseudoref()` to `is_root_ref()` Patrick Steinhardt
2024-04-30 20:20 ` Junio C Hamano
2024-04-30 12:26 ` [PATCH v2 05/10] refs: refname `is_special_ref()` to `is_pseudo_ref()` Patrick Steinhardt
2024-04-30 12:58 ` Karthik Nayak
2024-04-30 12:26 ` [PATCH v2 06/10] refs: classify HEAD as a root ref Patrick Steinhardt
2024-04-30 12:26 ` [PATCH v2 07/10] refs: root refs can be symbolic refs Patrick Steinhardt
2024-04-30 17:09 ` Justin Tobler
2024-05-02 8:07 ` Patrick Steinhardt
2024-05-03 20:49 ` Justin Tobler
2024-05-07 10:32 ` Patrick Steinhardt
2024-04-30 12:26 ` [PATCH v2 08/10] refs: pseudorefs are no refs Patrick Steinhardt
2024-04-30 12:27 ` [PATCH v2 09/10] ref-filter: properly distinuish pseudo and root refs Patrick Steinhardt
2024-04-30 13:11 ` Karthik Nayak
2024-05-02 8:08 ` Patrick Steinhardt
2024-05-02 10:03 ` Karthik Nayak
2024-04-30 12:27 ` [PATCH v2 10/10] refs: refuse to write pseudorefs Patrick Steinhardt
2024-05-02 8:17 ` [PATCH v3 00/10] Clarify pseudo-ref terminology Patrick Steinhardt
2024-05-02 8:17 ` [PATCH v3 01/10] Documentation/glossary: redefine pseudorefs as special refs Patrick Steinhardt
2024-05-02 8:17 ` [PATCH v3 02/10] Documentation/glossary: clarify limitations of pseudorefs Patrick Steinhardt
2024-05-02 8:17 ` [PATCH v3 03/10] Documentation/glossary: define root refs as refs Patrick Steinhardt
2024-05-02 8:17 ` [PATCH v3 04/10] refs: rename `is_pseudoref()` to `is_root_ref()` Patrick Steinhardt
2024-05-02 8:17 ` [PATCH v3 05/10] refs: refname `is_special_ref()` to `is_pseudo_ref()` Patrick Steinhardt
2024-05-02 8:17 ` [PATCH v3 06/10] refs: classify HEAD as a root ref Patrick Steinhardt
2024-05-02 8:17 ` [PATCH v3 07/10] refs: root refs can be symbolic refs Patrick Steinhardt
2024-05-03 18:13 ` Jeff King
2024-05-15 4:16 ` Patrick Steinhardt
2024-05-15 4:39 ` Patrick Steinhardt
2024-05-15 6:22 ` Jeff King
2024-05-15 6:35 ` Patrick Steinhardt
2024-05-15 6:49 ` Jeff King
2024-05-15 6:59 ` Patrick Steinhardt
2024-05-15 6:20 ` Jeff King
2024-05-02 8:17 ` [PATCH v3 08/10] refs: pseudorefs are no refs Patrick Steinhardt
2024-05-02 8:17 ` [PATCH v3 09/10] ref-filter: properly distinuish pseudo and root refs Patrick Steinhardt
2024-05-02 8:17 ` [PATCH v3 10/10] refs: refuse to write pseudorefs Patrick Steinhardt
2024-05-10 8:48 ` [PATCH v4 00/10] Clarify pseudo-ref terminology Patrick Steinhardt
2024-05-10 8:48 ` [PATCH v4 01/10] Documentation/glossary: redefine pseudorefs as special refs Patrick Steinhardt
2024-05-10 8:48 ` [PATCH v4 02/10] Documentation/glossary: clarify limitations of pseudorefs Patrick Steinhardt
2024-05-10 8:48 ` [PATCH v4 03/10] Documentation/glossary: define root refs as refs Patrick Steinhardt
2024-05-10 8:48 ` [PATCH v4 04/10] refs: rename `is_pseudoref()` to `is_root_ref()` Patrick Steinhardt
2024-05-10 8:48 ` [PATCH v4 05/10] refs: refname `is_special_ref()` to `is_pseudo_ref()` Patrick Steinhardt
2024-05-10 8:48 ` [PATCH v4 06/10] refs: root refs can be symbolic refs Patrick Steinhardt
2024-05-10 8:48 ` [PATCH v4 07/10] refs: classify HEAD as a root ref Patrick Steinhardt
2024-05-10 8:48 ` [PATCH v4 08/10] refs: pseudorefs are no refs Patrick Steinhardt
2024-05-10 8:48 ` [PATCH v4 09/10] ref-filter: properly distinuish pseudo and root refs Patrick Steinhardt
2024-05-10 8:48 ` [PATCH v4 10/10] refs: refuse to write pseudorefs Patrick Steinhardt
2024-05-10 18:59 ` [PATCH v4 00/10] Clarify pseudo-ref terminology Junio C Hamano
2024-05-15 6:50 ` [PATCH v5 " Patrick Steinhardt
2024-05-15 6:50 ` [PATCH v5 01/10] Documentation/glossary: redefine pseudorefs as special refs Patrick Steinhardt
2024-05-15 6:50 ` [PATCH v5 02/10] Documentation/glossary: clarify limitations of pseudorefs Patrick Steinhardt
2024-05-15 6:50 ` [PATCH v5 03/10] Documentation/glossary: define root refs as refs Patrick Steinhardt
2024-05-15 6:50 ` [PATCH v5 04/10] refs: rename `is_pseudoref()` to `is_root_ref()` Patrick Steinhardt
2024-05-15 6:50 ` [PATCH v5 05/10] refs: rename `is_special_ref()` to `is_pseudo_ref()` Patrick Steinhardt
2024-05-15 6:50 ` [PATCH v5 06/10] refs: do not check ref existence in `is_root_ref()` Patrick Steinhardt
2024-05-15 20:38 ` Justin Tobler
2024-05-16 4:13 ` Patrick Steinhardt
2024-05-15 6:50 ` [PATCH v5 07/10] refs: classify HEAD as a root ref Patrick Steinhardt
2024-05-15 20:44 ` Justin Tobler
2024-05-15 6:51 ` [PATCH v5 08/10] refs: pseudorefs are no refs Patrick Steinhardt
2024-05-15 6:51 ` [PATCH v5 09/10] ref-filter: properly distinuish pseudo and root refs Patrick Steinhardt
2024-05-15 6:51 ` [PATCH v5 10/10] refs: refuse to write pseudorefs 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=dbe3283c-7814-48ca-af47-2246965b2794@gmail.com \
--to=phillip.wood123@gmail.com \
--cc=git@vger.kernel.org \
--cc=karthik.188@gmail.com \
--cc=peff@peff.net \
--cc=phillip.wood@dunelm.org.uk \
--cc=ps@pks.im \
/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).