From: Jeff King <peff@peff.net>
To: Davide Berardi <berardi.dav@gmail.com>
Cc: git@vger.kernel.org, Johannes.Schindelin@gmx.de, gitster@pobox.com
Subject: Re: [PATCH] Segmentation Fault on non-commit --branch clone
Date: Fri, 1 Nov 2019 15:43:39 -0400 [thread overview]
Message-ID: <20191101194339.GB1169@sigill.intra.peff.net> (raw)
In-Reply-To: <20191101002432.GA49846@carpenter.lan>
On Fri, Nov 01, 2019 at 01:24:32AM +0100, Davide Berardi wrote:
> Fixed segmentation fault that can be triggered using
> $ git clone --branch $object $repository
> with object pointing to a non-commit ref (e.g. a blob).
Thanks for working on this. I left some thoughts on the overall fallback
scheme in the other part of the thread, and other than I agree with all
of Dscho's review.
A few other comments:
> +static int fallback_on_noncommit(const struct ref *check,
> + const struct ref *remote,
> + const char *msg)
> +{
> + if (check == NULL)
> + return 1;
I wondered in what circumstances "check" would be NULL. In the first
conditional we pass "our" after checking it's non-NULL:
> if (our && skip_prefix(our->name, "refs/heads/", &head)) {
> + if (fallback_on_noncommit(our, remote, msg) != 0)
and then again in the second case-arm:
> } else if (our) {
> + if (fallback_on_noncommit(our, remote, msg) != 0)
and then in the third we pass remote after checking that it's not NULL:
> } else if (remote) {
> + if (fallback_on_noncommit(remote, remote, msg) != 0)
> + return;
So I think this NULL check can go away. In general I don't mind
functions being defensive, but it's hard to decide whether it's doing
the right thing since it's not a case we think can come up (it could be
marked with a BUG() assertion, but IMHO it's not worth it; most
functions require their arguments to be non-NULL, so checking it would
be unusual in our code base).
> +static int fallback_on_noncommit(const struct ref *check,
> + const struct ref *remote,
> + const char *msg)
> [...]
> + return c == NULL;
The return value for this function is unusual for our code base. If it's
just an error return, we'd usually use "0" for success and a negative
value for errors (i.e., mimicking system calls).
> diff --git a/refs.h b/refs.h
> index 730d05ad91..35ee6eb058 100644
> --- a/refs.h
> +++ b/refs.h
> @@ -497,6 +497,13 @@ enum action_on_err {
> UPDATE_REFS_QUIET_ON_ERR
> };
>
> +/*
> + * In case of a remote HEAD pointing to a non-commit update_head
> + * will make HEAD reference fallback to this value, master ref
> + * should be safe.
> + */
> +#define FALLBACK_REF "refs/heads/master"
> +
> /*
Since this is only used in one spot, I think it's better to keep it
localized to that function. E.g., with:
static const char fallback_ref[] = "refs/heads/master";
That way it's clear that no other code depends on it.
-Peff
next prev parent reply other threads:[~2019-11-01 19:43 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-11-01 0:24 [PATCH] Segmentation Fault on non-commit --branch clone Davide Berardi
2019-11-01 19:08 ` Johannes Schindelin
2019-11-01 19:35 ` Jeff King
2019-11-02 10:16 ` Junio C Hamano
2019-11-03 18:16 ` Davide Berardi
2019-11-04 3:55 ` Junio C Hamano
2019-11-02 9:18 ` Junio C Hamano
2019-11-01 19:43 ` Jeff King [this message]
2019-11-02 10:07 ` Junio C Hamano
2019-11-03 18:07 ` [PATCH v2] clone: Don't segfault on -b specifing a non-commit Davide Berardi
2019-11-05 4:37 ` Jeff King
2019-11-06 1:36 ` Junio C Hamano
2019-11-06 4:05 ` Jeff King
2019-11-06 9:53 ` Junio C Hamano
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
List information: http://vger.kernel.org/majordomo-info.html
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20191101194339.GB1169@sigill.intra.peff.net \
--to=peff@peff.net \
--cc=Johannes.Schindelin@gmx.de \
--cc=berardi.dav@gmail.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.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.
Code repositories for project(s) associated with this public inbox
https://80x24.org/mirrors/git.git
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 read-only IMAP folder(s) and NNTP newsgroup(s).