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: "Kyle J. McKay" <mackyle@gmail.com>,
	Git mailing list <git@vger.kernel.org>
Subject: Re: Bug in fetch-pack.c, please confirm
Date: Thu, 19 Mar 2015 14:55:17 -0400	[thread overview]
Message-ID: <20150319185517.GB8788@peff.net> (raw)
In-Reply-To: <xmqqfv90khpd.fsf@gitster.dls.corp.google.com>

On Thu, Mar 19, 2015 at 10:41:50AM -0700, Junio C Hamano wrote:

> Just to make sure we do not keep this hanging forever and eventually
> forget it, I'm planning to queue this.

Thanks for following up. A few minor nits (and maybe a more serious
problem) on the explanation in the commit message:

> be complete., 2005-10-19) and ever since we instead stuffed a random
> bytes in ref->new_sha1 here.

s/a random/random/

> It turns out that no codepath that comes after this assignment even
> looks at ref->new_sha1 at all.
> 
>  - The only caller of everything_local(), do_fetch_pack(), returns
>    this list of ref, whose element has bogus new_sha1 values, to its
>    caller.  It does not look at the elements and acts on them.

s/list of ref/list of refs/ ? Or did you mean "the list we store in the
'ref' variable"?

I'm not sure what the final sentence means. Should it be "It does not
look at the elements nor act on them"?

do_fetch_pack actually does pass them down to find_common. But the
latter does not look at ref->new_sha1, so we're OK.

>  - The only caller of do_fetch_pack(), fetch_pack(), returns this
>    list to its caller.  It does not look at the elements and acts on
>    them.

Ditto on the wording in the final sentence here (but it is correct in
this case that we do not touch the list at all).

>  - The other caller of fetch_pack() is fetch_refs_via_pack() in the
>    transport layer, which is a helper that implements "git fetch".
>    It only cares about whether the returned list is empty (i.e.
>    failed to fetch anything).

So I thought I would follow this up by adding a free_refs() call in
fetch_refs_via_pack. After all, we just leak that list, right?

If only it were so simple. It turns out that the list returned from
fetch_pack() is _mostly_ a copy of the incoming refs list we give it.
But in filter_refs(), if allow_tip_sha1_in_want is set, we actually add
the unmatched "sought" refs here, too.

Which means we may be setting new_sha1 in one of these "sought" refs,
and that broadens the scope of code that might be affected by the patch
we have been discussing. However, I think the filter_refs code is wrong,
and should be making a copy of the sought refs to put in the new list.

I'm working up a few patches in that area, which I'll send out in a few
minutes. Once that is done, then I think the explanation you give above
would be correct.

-Peff

  reply	other threads:[~2015-03-19 18:55 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-03-15  6:37 Bug in fetch-pack.c, please confirm Kyle J. McKay
2015-03-15  7:27 ` Junio C Hamano
2015-03-15  7:30   ` Junio C Hamano
2015-03-15 22:21     ` Kyle J. McKay
2015-03-16  1:13 ` Jeff King
2015-03-19 17:41   ` Junio C Hamano
2015-03-19 18:55     ` Jeff King [this message]
2015-03-19 19:01       ` Junio C Hamano
2015-03-19 20:31         ` Jeff King
2015-03-19 20:34           ` [PATCH 1/4] filter_ref: avoid overwriting ref->old_sha1 with garbage Jeff King
2015-03-19 21:09             ` Junio C Hamano
2015-03-19 20:37           ` [PATCH 2/4] filter_ref: make a copy of extra "sought" entries Jeff King
2015-03-19 20:38           ` [PATCH 3/4] fetch_refs_via_pack: free extra copy of refs Jeff King
2015-03-19 20:39           ` [PATCH 4/4] fetch-pack: remove dead assignment to ref->new_sha1 Jeff King

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=20150319185517.GB8788@peff.net \
    --to=peff@peff.net \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.com \
    --cc=mackyle@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 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).