git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Jeff King <peff@peff.net>
To: Junio C Hamano <gitster@pobox.com>
Cc: git@vger.kernel.org, Gabriel Souza Franco <gabrielfrancosouza@gmail.com>
Subject: Re: [PATCH] fetch-pack: fix unadvertised requests validation
Date: Sat, 27 Feb 2016 14:07:12 -0500	[thread overview]
Message-ID: <20160227190712.GC12822@sigill.intra.peff.net> (raw)
In-Reply-To: <xmqqd1riggd7.fsf@gitster.mtv.corp.google.com>

On Sat, Feb 27, 2016 at 10:25:40AM -0800, Junio C Hamano wrote:

> Gabriel Souza Franco <gabrielfrancosouza@gmail.com> writes:
> 
> > Check was introduced in b791642 (filter_ref: avoid overwriting
> > ref->old_sha1 with garbage, 2015-03-19), but was always false because
> > ref->old_oid.hash is empty in this case. Instead copy sha1 from ref->name.
> >
> > Signed-off-by: Gabriel Souza Franco <gabrielfrancosouza@gmail.com>
> > ---
> 
> Peff, that commit points me at your direction.  And I can see the
> original patch avoids overwriting old_sha1 by saving the result from
> get_sha1_hex() in a temporary, it is true that old_sha1 is not
> updated from the temporary.
> 
> The original code before b791642 wanted to say "if ref->name is not
> 40-hex, continue, and otherwise, do the ref->matched thing" and an
> implementation of b791642 that is more faithful to the original
> would indeed have been the result of applying this patch from
> Gabriel, but I am scratching my head why we have hashcmp() there.
> 
> Was it to avoid adding the same thing twice to the resulting list,
> or something?

It is a sanity check. The code is looking in our list of things to fetch
for items that are pure objects, not refs (we already matched the refs
by name, but obviously would not have matched any pure-sha1 requests to
refnames).  So the conditional really is:

   if (!is_a_pure_sha1(ref))
	continue;

We can implement that as:

  if (get_sha1_hex(ref->name, sha1) || ref->name[40] != '\0')

but as noted in the commit message for b791642:

  We could just check that we have exactly 40 characters of
  sha1. But let's be even more careful and make sure that we
  have a 40-char hex refname that matches what is in old_sha1.
  This is perhaps overly defensive, but spells out our
  assumptions clearly.

E.g., if you did this:

  git fetch-pack --stdin $remote <<\EOF
  1234567890123456789012345678901234567890 abcdef1234abcdef1234abcdef1234abcdef1234
  EOF

you'd have a "struct ref" with a 40-hex sha1, but which does _not_ want
the object of the same name. This is not a pure-object request, and we
should only request 1234... if the ref abcd... is present on the remote.

I doubt it would ever come up in real life; refs tend to start with
"refs/", and I suspect short of manual prodding as above, you could not
get anything without "refs/" to this point of the code.

So the patch:

> > diff --git a/fetch-pack.c b/fetch-pack.c
> > index 01e34b6..83b937b 100644
> > --- a/fetch-pack.c
> > +++ b/fetch-pack.c
> > @@ -569,11 +569,11 @@ static void filter_refs(struct fetch_pack_args *args,
> >  			if (ref->matched)
> >  				continue;
> >  			if (get_sha1_hex(ref->name, sha1) ||
> > -			    ref->name[40] != '\0' ||
> > -			    hashcmp(sha1, ref->old_oid.hash))
> > +			    ref->name[40] != '\0')
> >  				continue;
> >  
> >  			ref->matched = 1;
> > +			hashcpy(ref->old_oid.hash, sha1);
> >  			*newtail = copy_ref(ref);
> >  			newtail = &(*newtail)->next;
> >  		}

is a wrong direction, I think. It removes the extra safety check that
skips the ref above. But worse, in the example above, it overwrites the
real object "1234..." with the name of the ref "abcd..." in the sha1
field. We'll ask for an object that may not even exist.

The commit message for Gabriel's patch says:

> > Check was introduced in b791642 (filter_ref: avoid overwriting
> > ref->old_sha1 with garbage, 2015-03-19), but was always false because
> > ref->old_oid.hash is empty in this case. Instead copy sha1 from ref->name.

but I don't think ref->old_oid.hash _is_ empty. At least, that was not
the conclusion from our discussion in:

   http://thread.gmane.org/gmane.comp.version-control.git/265480

We expect whoever creates the "sought" list to fill in the name and sha1
as appropriate. If that is not happening in some code path, then yeah,
filter_refs() will not work as intended. But I think the solution there
would be to fix the caller to set up the "struct ref" more completely.

Gabriel, did this come from a bug you noticed in practice, or was it
just an intended cleanup?

-Peff

  parent reply	other threads:[~2016-02-27 19:07 UTC|newest]

Thread overview: 28+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-02-27 12:43 [PATCH] fetch-pack: fix unadvertised requests validation Gabriel Souza Franco
2016-02-27 18:25 ` Junio C Hamano
2016-02-27 18:32   ` Junio C Hamano
2016-02-27 18:38     ` Junio C Hamano
2016-02-27 19:07   ` Jeff King [this message]
2016-02-27 19:19     ` Jeff King
2016-02-27 20:28       ` Gabriel Souza Franco
2016-02-27 20:32         ` [PATCH] fetch-pack: fix object_id of exact sha1 Gabriel Souza Franco
2016-02-27 22:12           ` Jeff King
2016-02-27 22:23             ` Gabriel Souza Franco
2016-02-28 19:29               ` Junio C Hamano
2016-02-28 22:22                 ` [PATCH v2] " Gabriel Souza Franco
2016-02-29  8:30                   ` Johannes Schindelin
2016-02-29 10:00                   ` Jeff King
2016-03-01  2:08                     ` Gabriel Souza Franco
2016-03-01  2:12                       ` [PATCH v3] " Gabriel Souza Franco
2016-03-01  4:54                         ` Jeff King
2016-03-03 23:35                           ` Gabriel Souza Franco
2016-03-04  0:50                             ` Jeff King
2016-03-05  1:11                               ` [PATCH v4] " Gabriel Souza Franco
2016-03-05 16:59                                 ` Jeff King
2016-03-05 18:54                                   ` Junio C Hamano
2016-03-05 19:34                                     ` [PATCH] fetch-pack: update the documentation for "<refs>..." arguments Gabriel Souza Franco
2016-03-05 19:35                                       ` Junio C Hamano
2016-03-01  4:40                       ` [PATCH v2] fetch-pack: fix object_id of exact sha1 Jeff King
2016-02-29  9:50                 ` [PATCH] " Jeff King
2016-02-27 22:08         ` [PATCH] fetch-pack: fix unadvertised requests validation Jeff King
2016-02-28 19:14     ` 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

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20160227190712.GC12822@sigill.intra.peff.net \
    --to=peff@peff.net \
    --cc=gabrielfrancosouza@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.
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).