git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / Atom feed
From: Jeff King <peff@peff.net>
To: Jacob Vosmaer <jacob@gitlab.com>
Cc: Jeff Hostetler <jeffhost@microsoft.com>,
	Jonathan Tan <jonathantanmy@google.com>,
	git@vger.kernel.org
Subject: Re: [PATCH 1/1] upload-pack.c: fix filter spec quoting bug
Date: Fri, 22 Jan 2021 15:32:04 -0500	[thread overview]
Message-ID: <YAs2RMT1rEH/2LSp@coredump.intra.peff.net> (raw)
In-Reply-To: <20210122142137.21161-2-jacob@gitlab.com>

On Fri, Jan 22, 2021 at 03:21:37PM +0100, Jacob Vosmaer wrote:

> This fixes a bug that occurs when you combine partial clone and
> uploadpack.packobjectshook. You can reproduce it as follows:
> 
> git clone -u 'git -c uploadpack.allowfilter '\
> '-c uploadpack.packobjectshook=" exec" '\
> 'upload-pack' --filter=blob:none --no-local \
> src.git dst.git
> 
> Be careful with the line endings because this has a long quoted string
> as the -u argument. Note that there is an intentional space before
> 'exec'. Without that space, run-command.c tries to be smart and the
> command fails for the wrong reason.

The "-u" command is run with a shell, so:

  git clone \
    -u 'git -c uploadpack.allowfilter \
            -c uploadpack.packobjectshook=env \
	    upload-pack' \
  --filter=blob:none --no-local src.git dst.git

may be a more readable version. I also found the use of " exec" clever,
but rather subtle; you need the extra space so that our "don't bother
using a shell" run-command optimization does not kick in. I replaced it
with "env" here, which is a slightly more canonical way of running a
sub-program that does not rely on shell builtins.

But all of this should be added as a new test, probably in t5544 with
the other pack-objects hook tests.

> The problem is an unnecessary and harmful layer of quoting. I tried
> digging through the history of this function and I think this quoting
> was there from the start. My best guess is that it stems from a
> misunderstanding of what use_shell=1 means. The code seems to assume
> it means "arguments get joined into one big string, then fed to
> /bin/sh". But that is not what it means: use_shell=1 means that the
> first argument in the arguments array may be a shell script and if so
> should be passed to /bin/sh. All other arguments are passed as normal
> arguments.

Yeah, that is exactly right. "use_shell" just means that the command is
(possibly) run with a shell. Quoting for any extra arguments is handled
automatically.

I think you're correct that this was broken from the start in 10ac85c785
(upload-pack: add object filtering for partial clone, 2017-12-08).
That's even before the use_shell was added, and then later it was pushed
into that conditional by 0b6069fe0a (fetch-pack: test support excluding
large blobs, 2017-12-08). Presumably because the non-hook path would not
have worked at all, and that was the first time any of it was actually
tested. ;)

(I've cc'd authors of those commits as an FYI; I think both were
relatively new to the project at the time so misunderstanding this
subtlety of run-command is not too surprising).

I'm somewhat embarrassed to say that despite being the one who added the
pack-objects hook 4 years ago, we still have not switched over to it at
GitHub from our custom patch (the reason is just mundane; there's some
other adjustments that would have to happen and nobody has ever quite
gotten around to it). Presumably you are looking to use it at GitLab.
Just beware that you are probably treading new-ish ground, so there may
be other bugs like this lurking.

> diff --git a/upload-pack.c b/upload-pack.c
> index 3b66bf92ba..eae1fdbc55 100644
> --- a/upload-pack.c
> +++ b/upload-pack.c
> @@ -305,14 +305,7 @@ static void create_pack_file(struct upload_pack_data *pack_data,
>  	if (pack_data->filter_options.choice) {
>  		const char *spec =
>  			expand_list_objects_filter_spec(&pack_data->filter_options);
> -		if (pack_objects.use_shell) {
> -			struct strbuf buf = STRBUF_INIT;
> -			sq_quote_buf(&buf, spec);
> -			strvec_pushf(&pack_objects.args, "--filter=%s", buf.buf);
> -			strbuf_release(&buf);
> -		} else {
> -			strvec_pushf(&pack_objects.args, "--filter=%s", spec);
> -		}
> +		strvec_pushf(&pack_objects.args, "--filter=%s", spec);

Yep, this looks like the right fix. I think with an addition to the test
suite, this will be good to go.

-Peff

  reply	other threads:[~2021-01-22 20:35 UTC|newest]

Thread overview: 37+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-01-22 14:21 [PATCH 0/1] upload-pack.c: fix filter spec quoting bug Jacob Vosmaer
2021-01-22 14:21 ` [PATCH 1/1] " Jacob Vosmaer
2021-01-22 20:32   ` Jeff King [this message]
2021-01-22 21:03     ` [PATCH] run-command: document use_shell option Jeff King
2021-01-22 21:32       ` Taylor Blau
2021-01-22 22:21       ` Junio C Hamano
2021-01-23  0:04         ` Jeff King
2021-01-22 22:10     ` [PATCH 1/1] upload-pack.c: fix filter spec quoting bug Junio C Hamano
2021-01-25 17:09     ` [PATCH v2] " Jacob Vosmaer
2021-01-25 19:48       ` Junio C Hamano
2021-01-25 21:16         ` Jeff King
2021-01-25 23:09           ` [PATCH v3 0/1] " Jacob Vosmaer
2021-01-25 23:09             ` [PATCH v3 1/1] " Jacob Vosmaer
2021-01-26  9:57               ` Ævar Arnfjörð Bjarmason
2021-01-26 10:29                 ` Jacob Vosmaer
2021-01-26 17:46                   ` Junio C Hamano
2021-01-26 21:09                   ` Jeff King
2021-01-28 16:04                     ` [PATCH v4] " Jacob Vosmaer
     [not found]                       ` <xmqqmtwsx4d9.fsf@gitster.c.googlers.com>
2021-01-28 21:12                         ` Jacob Vosmaer
2021-01-28 21:40                           ` Jacob Vosmaer
2021-01-28 21:51                           ` Jeff King
2021-02-01 20:31                             ` Jacob Vosmaer
2021-01-28 21:58                           ` Junio C Hamano
2021-02-01 20:29                             ` [PATCH v5 0/1] " Jacob Vosmaer
2021-02-01 20:29                               ` [PATCH v5 1/1] " Jacob Vosmaer
2021-02-02  5:49                               ` [PATCH v5 0/1] " Junio C Hamano
2021-02-02 10:37                                 ` [PATCH 1/1] t5544: clarify 'hook works with partial clone' test Jacob Vosmaer
2021-02-02 17:22                                   ` Eric Sunshine
2021-02-02 19:24                                     ` [PATCH v2] " Jacob Vosmaer
2021-02-02 20:21                                       ` Junio C Hamano
2021-01-26 17:51                 ` [PATCH v3 1/1] upload-pack.c: fix filter spec quoting bug Junio C Hamano
2021-01-26 21:07                 ` Jeff King
2021-01-26  0:01             ` [PATCH v3 0/1] " Junio C Hamano
2021-01-26  2:25           ` [PATCH v2] " Junio C Hamano
2021-01-25 21:16       ` Jeff King
2021-01-25 17:14     ` [PATCH 1/1] " Jacob Vosmaer
2021-01-25 17:41     ` Jacob Vosmaer

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=YAs2RMT1rEH/2LSp@coredump.intra.peff.net \
    --to=peff@peff.net \
    --cc=git@vger.kernel.org \
    --cc=jacob@gitlab.com \
    --cc=jeffhost@microsoft.com \
    --cc=jonathantanmy@google.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).