git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Brandon Williams <bmwill@google.com>
To: Stefan Beller <sbeller@google.com>
Cc: "git@vger.kernel.org" <git@vger.kernel.org>,
	Jeff King <peff@peff.net>, Junio C Hamano <gitster@pobox.com>,
	Jonathan Nieder <jrnieder@gmail.com>,
	bturner@atlassian.com, Jeff Hostetler <git@jeffhostetler.com>,
	Jonathan Tan <jonathantanmy@google.com>
Subject: Re: [PATCH 3/8] daemon: recognize hidden request arguments
Date: Mon, 18 Sep 2017 09:56:15 -0700	[thread overview]
Message-ID: <20170918165615.GE144331@google.com> (raw)
In-Reply-To: <CAGZ79kZkGfM=2Nek66gvZnbMAu2HLUkbd4D4S5Rij1D_t5DYKg@mail.gmail.com>

On 09/13, Stefan Beller wrote:
> On Wed, Sep 13, 2017 at 2:54 PM, Brandon Williams <bmwill@google.com> wrote:
> > A normal request to git-daemon is structured as
> > "command path/to/repo\0host=..\0" and due to a bug in an old version of
> > git-daemon 73bb33a94 (daemon: Strictly parse the "extra arg" part of the
> > command, 2009-06-04) we aren't able to place any extra args (separated
> > by NULs) besides the host.
> >
> > In order to get around this limitation teach git-daemon to recognize
> > additional request arguments hidden behind a second NUL byte.  Requests
> > can then be structured like:
> > "command path/to/repo\0host=..\0\0version=1\0key=value\0".  git-daemon
> > can then parse out the extra arguments and set 'GIT_PROTOCOL'
> > accordingly.
> >
> > Signed-off-by: Brandon Williams <bmwill@google.com>
> > ---
> >  daemon.c | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++++---------
> >  1 file changed, 61 insertions(+), 10 deletions(-)
> >
> > diff --git a/daemon.c b/daemon.c
> > index 30747075f..250dbf82c 100644
> > --- a/daemon.c
> > +++ b/daemon.c
> > @@ -282,7 +282,7 @@ static const char *path_ok(const char *directory, struct hostinfo *hi)
> >         return NULL;            /* Fallthrough. Deny by default */
> >  }
> >
> > -typedef int (*daemon_service_fn)(void);
> > +typedef int (*daemon_service_fn)(const struct argv_array *env);
> >  struct daemon_service {
> >         const char *name;
> >         const char *config_name;
> > @@ -363,7 +363,7 @@ static int run_access_hook(struct daemon_service *service, const char *dir,
> >  }
> >
> >  static int run_service(const char *dir, struct daemon_service *service,
> > -                      struct hostinfo *hi)
> > +                      struct hostinfo *hi, const struct argv_array *env)
> >  {
> >         const char *path;
> >         int enabled = service->enabled;
> > @@ -422,7 +422,7 @@ static int run_service(const char *dir, struct daemon_service *service,
> >          */
> >         signal(SIGTERM, SIG_IGN);
> >
> > -       return service->fn();
> > +       return service->fn(env);
> >  }
> >
> >  static void copy_to_log(int fd)
> > @@ -462,25 +462,34 @@ static int run_service_command(struct child_process *cld)
> >         return finish_command(cld);
> >  }
> >
> > -static int upload_pack(void)
> > +static int upload_pack(const struct argv_array *env)
> >  {
> >         struct child_process cld = CHILD_PROCESS_INIT;
> >         argv_array_pushl(&cld.args, "upload-pack", "--strict", NULL);
> >         argv_array_pushf(&cld.args, "--timeout=%u", timeout);
> > +
> > +       argv_array_pushv(&cld.env_array, env->argv);
> > +
> >         return run_service_command(&cld);
> >  }
> >
> > -static int upload_archive(void)
> > +static int upload_archive(const struct argv_array *env)
> >  {
> >         struct child_process cld = CHILD_PROCESS_INIT;
> >         argv_array_push(&cld.args, "upload-archive");
> > +
> > +       argv_array_pushv(&cld.env_array, env->argv);
> > +
> >         return run_service_command(&cld);
> >  }
> >
> > -static int receive_pack(void)
> > +static int receive_pack(const struct argv_array *env)
> >  {
> >         struct child_process cld = CHILD_PROCESS_INIT;
> >         argv_array_push(&cld.args, "receive-pack");
> > +
> > +       argv_array_pushv(&cld.env_array, env->argv);
> > +
> >         return run_service_command(&cld);
> >  }
> >
> > @@ -574,7 +583,7 @@ static void canonicalize_client(struct strbuf *out, const char *in)
> >  /*
> >   * Read the host as supplied by the client connection.
> >   */
> > -static void parse_host_arg(struct hostinfo *hi, char *extra_args, int buflen)
> > +static char *parse_host_arg(struct hostinfo *hi, char *extra_args, int buflen)
> >  {
> >         char *val;
> >         int vallen;
> > @@ -602,6 +611,39 @@ static void parse_host_arg(struct hostinfo *hi, char *extra_args, int buflen)
> >                 if (extra_args < end && *extra_args)
> >                         die("Invalid request");
> >         }
> > +
> > +       return extra_args;
> > +}
> > +
> > +static void parse_extra_args(struct argv_array *env, const char *extra_args,
> > +                            int buflen)
> > +{
> > +       const char *end = extra_args + buflen;
> > +       struct strbuf git_protocol = STRBUF_INIT;
> > +
> > +       for (; extra_args < end; extra_args += strlen(extra_args) + 1) {
> > +               const char *arg = extra_args;
> > +
> > +               /*
> > +                * Parse the extra arguments, adding most to 'git_protocol'
> > +                * which will be used to set the 'GIT_PROTOCOL' envvar in the
> > +                * service that will be run.
> > +                *
> > +                * If there ends up being a particular arg in the future that
> > +                * git-daemon needs to parse specificly (like the 'host' arg)
> > +                * then it can be parsed here and not added to 'git_protocol'.
> > +                */
> > +               if (*arg) {
> > +                       if (git_protocol.len > 0)
> > +                               strbuf_addch(&git_protocol, ':');
> > +                       strbuf_addstr(&git_protocol, arg);
> > +               }
> > +       }
> > +
> > +       if (git_protocol.len > 0)
> > +               argv_array_pushf(env, GIT_PROTOCOL_ENVIRONMENT "=%s",
> > +                                git_protocol.buf);
> > +       strbuf_release(&git_protocol);
> >  }
> 
> I wonder if this could be written as
> 
>   begin = extra_args;
>   p = extra_args;
>   end = extra_args + buflen;
> 
>   while (p < end) {
>     if (!*p)
>         *p = ':';
>     p++;
>   }
>   argv_array_pushf(env, GIT_PROTOCOL_ENVIRONMENT "=%s", begin);
> 
> to ease the load on the server side, as then we do not
> have to copy the partial strings into strbufs and then
> count the length individually? (maybe performance is no big deal here?)

I'm sure something like that could work, and I don't know how
performance sensitive this bit is.  That and depending on if we need the
unmodified string for anything at a later point maybe its best to not
modify it in place?  I don't know :)

> 
> 
> >
> >  /*
> > @@ -695,6 +737,7 @@ static int execute(void)
> >         int pktlen, len, i;
> >         char *addr = getenv("REMOTE_ADDR"), *port = getenv("REMOTE_PORT");
> >         struct hostinfo hi;
> > +       struct argv_array env = ARGV_ARRAY_INIT;
> >
> >         hostinfo_init(&hi);
> >
> > @@ -716,8 +759,14 @@ static int execute(void)
> >                 pktlen--;
> >         }
> >
> > -       if (len != pktlen)
> > -               parse_host_arg(&hi, line + len + 1, pktlen - len - 1);
> > +       if (len != pktlen) {
> > +               const char *extra_args;
> > +               /* retrieve host */
> > +               extra_args = parse_host_arg(&hi, line + len + 1, pktlen - len - 1);
> > +
> > +               /* parse additional args hidden behind a second NUL byte */
> > +               parse_extra_args(&env, extra_args + 1, pktlen - (extra_args - line) - 1);
> > +       }
> >
> >         for (i = 0; i < ARRAY_SIZE(daemon_service); i++) {
> >                 struct daemon_service *s = &(daemon_service[i]);
> > @@ -730,13 +779,15 @@ static int execute(void)
> >                          * Note: The directory here is probably context sensitive,
> >                          * and might depend on the actual service being performed.
> >                          */
> > -                       int rc = run_service(arg, s, &hi);
> > +                       int rc = run_service(arg, s, &hi, &env);
> >                         hostinfo_clear(&hi);
> > +                       argv_array_clear(&env);
> >                         return rc;
> >                 }
> >         }
> >
> >         hostinfo_clear(&hi);
> > +       argv_array_clear(&env);
> >         logerror("Protocol error: '%s'", line);
> >         return -1;
> >  }
> > --
> > 2.14.1.690.gbb1197296e-goog
> >

-- 
Brandon Williams

  reply	other threads:[~2017-09-18 16:56 UTC|newest]

Thread overview: 161+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-09-13 21:54 [PATCH 0/8] protocol transition Brandon Williams
2017-09-13 21:54 ` [PATCH 1/8] pkt-line: add packet_write function Brandon Williams
2017-09-13 21:54 ` [PATCH 2/8] protocol: introduce protocol extention mechanisms Brandon Williams
2017-09-13 22:27   ` Stefan Beller
2017-09-18 17:02     ` Brandon Williams
2017-09-18 18:34       ` Stefan Beller
2017-09-18 19:58         ` Brandon Williams
2017-09-18 20:06           ` Stefan Beller
2017-09-13 21:54 ` [PATCH 3/8] daemon: recognize hidden request arguments Brandon Williams
2017-09-13 22:31   ` Stefan Beller
2017-09-18 16:56     ` Brandon Williams [this message]
2017-09-21  0:24   ` Jonathan Tan
2017-09-21  0:31     ` Jonathan Tan
2017-09-21 21:55       ` Brandon Williams
2017-09-13 21:54 ` [PATCH 4/8] upload-pack, receive-pack: introduce protocol version 1 Brandon Williams
2017-09-13 21:54 ` [PATCH 5/8] connect: teach client to recognize v1 server response Brandon Williams
2017-09-13 21:54 ` [PATCH 6/8] connect: tell server that the client understands v1 Brandon Williams
2017-09-13 21:54 ` [PATCH 7/8] http: " Brandon Williams
2017-09-13 21:54 ` [PATCH 8/8] i5700: add interop test for protocol transition Brandon Williams
2017-09-20 18:48 ` [PATCH 1.5/8] connect: die when a capability line comes after a ref Brandon Williams
2017-09-20 19:14   ` Jeff King
2017-09-20 20:06     ` Brandon Williams
2017-09-20 20:48       ` Jonathan Nieder
2017-09-21  3:02       ` Junio C Hamano
2017-09-21 20:45       ` [PATCH] connect: in ref advertisement, shallows are last Jonathan Tan
2017-09-21 23:45         ` [PATCH v2] " Jonathan Tan
2017-09-22  0:00           ` Brandon Williams
2017-09-22  0:08             ` [PATCH v3] " Jonathan Tan
2017-09-22  1:06               ` Junio C Hamano
2017-09-22  1:39                 ` Junio C Hamano
2017-09-22 16:45                   ` Brandon Williams
2017-09-22 20:15                     ` [PATCH v4] " Jonathan Tan
2017-09-22 21:01                       ` Brandon Williams
2017-09-22 22:16                         ` Jonathan Tan
2017-09-24  0:52                       ` Junio C Hamano
2017-09-26 18:21         ` [PATCH v5] " Jonathan Tan
2017-09-26 18:31           ` Brandon Williams
2017-09-26 23:56 ` [PATCH v2 0/9] protocol transition Brandon Williams
2017-09-26 23:56   ` [PATCH v2 1/9] connect: in ref advertisement, shallows are last Brandon Williams
2017-09-26 23:56   ` [PATCH v2 2/9] pkt-line: add packet_write function Brandon Williams
2017-09-26 23:56   ` [PATCH v2 3/9] protocol: introduce protocol extention mechanisms Brandon Williams
2017-09-27  5:17     ` Junio C Hamano
2017-09-27 11:23       ` Junio C Hamano
2017-09-29 21:20         ` Brandon Williams
2017-09-28 21:58       ` Brandon Williams
2017-09-27  6:30     ` Stefan Beller
2017-09-28 21:04       ` Brandon Williams
2017-09-26 23:56   ` [PATCH v2 4/9] daemon: recognize hidden request arguments Brandon Williams
2017-09-27  5:20     ` Junio C Hamano
2017-09-27 21:22       ` Brandon Williams
2017-09-28 16:57         ` Brandon Williams
2017-09-26 23:56   ` [PATCH v2 5/9] upload-pack, receive-pack: introduce protocol version 1 Brandon Williams
2017-09-27  5:23     ` Junio C Hamano
2017-09-27 21:29       ` Brandon Williams
2017-09-26 23:56   ` [PATCH v2 6/9] connect: teach client to recognize v1 server response Brandon Williams
2017-09-27  1:07     ` Junio C Hamano
2017-09-27 17:34       ` Brandon Williams
2017-09-27  5:29     ` Junio C Hamano
2017-09-28 22:08       ` Brandon Williams
2017-09-26 23:56   ` [PATCH v2 7/9] connect: tell server that the client understands v1 Brandon Williams
2017-09-27  6:21     ` Junio C Hamano
2017-09-27  6:29       ` Junio C Hamano
2017-09-29 21:32         ` Brandon Williams
2017-09-28 22:20       ` Brandon Williams
2017-09-26 23:56   ` [PATCH v2 8/9] http: " Brandon Williams
2017-09-27  6:24     ` Junio C Hamano
2017-09-27 21:36       ` Brandon Williams
2017-09-26 23:56   ` [PATCH v2 9/9] i5700: add interop test for protocol transition Brandon Williams
2017-10-03 20:14   ` [PATCH v3 00/10] " Brandon Williams
2017-10-03 20:14     ` [PATCH v3 01/10] connect: in ref advertisement, shallows are last Brandon Williams
2017-10-10 18:14       ` Jonathan Tan
2017-10-03 20:14     ` [PATCH v3 02/10] pkt-line: add packet_write function Brandon Williams
2017-10-10 18:15       ` Jonathan Tan
2017-10-03 20:15     ` [PATCH v3 03/10] protocol: introduce protocol extention mechanisms Brandon Williams
2017-10-06  9:09       ` Simon Ruderich
2017-10-06  9:40         ` Junio C Hamano
2017-10-06 11:11           ` Martin Ågren
2017-10-06 12:09             ` Junio C Hamano
2017-10-06 19:42               ` Martin Ågren
2017-10-06 20:27                 ` Stefan Beller
2017-10-08 14:24                   ` Martin Ågren
2017-10-10 21:00             ` Brandon Williams
2017-10-10 21:17               ` Jonathan Nieder
2017-10-10 21:32                 ` Stefan Beller
2017-10-11  0:39                 ` Junio C Hamano
2017-10-13 22:46                 ` Brandon Williams
2017-10-09  4:05           ` Martin Ågren
2017-10-10 19:51       ` Jonathan Tan
2017-10-03 20:15     ` [PATCH v3 04/10] daemon: recognize hidden request arguments Brandon Williams
2017-10-10 18:24       ` Jonathan Tan
2017-10-13 22:04         ` Brandon Williams
2017-10-03 20:15     ` [PATCH v3 05/10] upload-pack, receive-pack: introduce protocol version 1 Brandon Williams
2017-10-10 18:28       ` Jonathan Tan
2017-10-13 22:18         ` Brandon Williams
2017-10-03 20:15     ` [PATCH v3 06/10] connect: teach client to recognize v1 server response Brandon Williams
2017-10-03 20:15     ` [PATCH v3 07/10] connect: tell server that the client understands v1 Brandon Williams
2017-10-10 18:30       ` Jonathan Tan
2017-10-13 22:56         ` Brandon Williams
2017-10-03 20:15     ` [PATCH v3 08/10] http: " Brandon Williams
2017-10-03 20:15     ` [PATCH v3 09/10] i5700: add interop test for protocol transition Brandon Williams
2017-10-03 20:15     ` [PATCH v3 10/10] ssh: introduce a 'simple' ssh variant Brandon Williams
2017-10-03 21:42       ` Jonathan Nieder
2017-10-16 17:18         ` Brandon Williams
2017-10-23 21:28           ` [PATCH 0/5] Coping with unrecognized ssh wrapper scripts in GIT_SSH Jonathan Nieder
2017-10-23 21:29             ` [PATCH 1/5] connect: split git:// setup into a separate function Jonathan Nieder
2017-10-23 22:16               ` Stefan Beller
2017-10-24  0:09                 ` [WIP PATCH] diff: add option to ignore whitespaces for move detection only Stefan Beller
2017-10-24 18:48                   ` Brandon Williams
2017-10-25  1:25                     ` Junio C Hamano
2017-10-25  1:26                       ` Junio C Hamano
2017-10-25 18:58                         ` Brandon Williams
2017-10-24  1:54                 ` [PATCH 1/5] connect: split git:// setup into a separate function Junio C Hamano
2017-10-24  2:52                   ` Stefan Beller
2017-10-23 21:30             ` [PATCH 2/5] connect: split ssh command line options into " Jonathan Nieder
2017-10-23 21:48               ` Stefan Beller
2017-10-23 21:31             ` [PATCH 3/5] ssh: 'auto' variant to select between 'ssh' and 'simple' Jonathan Nieder
2017-10-23 22:19               ` Jonathan Tan
2017-10-23 22:43                 ` Jonathan Nieder
2017-10-23 22:51                   ` Brandon Williams
2017-10-23 22:57                     ` Jonathan Tan
2017-10-23 23:16                       ` [PATCH v2 0/5] Coping with unrecognized ssh wrapper scripts in GIT_SSH Jonathan Nieder
2017-10-23 23:17                         ` [PATCH 1/5] connect: split git:// setup into a separate function Jonathan Nieder
2017-10-24  1:44                           ` Junio C Hamano
2017-11-15 20:25                             ` Jonathan Nieder
2017-11-17  1:12                               ` Junio C Hamano
2017-10-23 23:17                         ` [PATCH 2/5] connect: split ssh command line options into " Jonathan Nieder
2017-10-24  2:01                           ` Junio C Hamano
2017-10-23 23:18                         ` [PATCH 3/5] ssh: 'auto' variant to select between 'ssh' and 'simple' Jonathan Nieder
2017-10-23 23:27                           ` Brandon Williams
2017-10-23 23:33                             ` Stefan Beller
2017-10-23 23:19                         ` [PATCH 4/5] ssh: 'simple' variant does not support -4/-6 Jonathan Nieder
2017-10-23 23:19                         ` [PATCH 5/5] ssh: 'simple' variant does not support --port Jonathan Nieder
2017-10-24  2:22                         ` [PATCH v2 0/5] Coping with unrecognized ssh wrapper scripts in GIT_SSH Junio C Hamano
2017-10-23 23:12                     ` [PATCH 3/5] ssh: 'auto' variant to select between 'ssh' and 'simple' Jonathan Nieder
2017-10-23 22:33               ` Stefan Beller
2017-10-23 22:54                 ` Jonathan Nieder
2017-10-24  2:16               ` Junio C Hamano
2017-10-25 12:51               ` Johannes Schindelin
2017-10-25 16:18                 ` Stefan Beller
2017-10-25 16:32                   ` Jonathan Nieder
2017-10-30  0:40                     ` Junio C Hamano
2017-10-30 12:37                       ` Johannes Schindelin
2017-10-23 21:32             ` [PATCH 4/5] ssh: 'simple' variant does not support -4/-6 Jonathan Nieder
2017-10-23 21:33             ` [PATCH 5/5] ssh: 'simple' variant does not support --port Jonathan Nieder
2017-10-23 22:37               ` Stefan Beller
2017-10-04  6:20     ` [PATCH v3 00/10] protocol transition Junio C Hamano
2017-10-10 19:39     ` [PATCH] Documentation: document Extra Parameters Jonathan Tan
2017-10-13 22:26       ` Brandon Williams
2017-10-16 17:55     ` [PATCH v4 00/11] protocol transition Brandon Williams
2017-10-16 17:55       ` [PATCH v4 01/11] connect: in ref advertisement, shallows are last Brandon Williams
2017-10-16 17:55       ` [PATCH v4 02/11] pkt-line: add packet_write function Brandon Williams
2017-10-16 17:55       ` [PATCH v4 03/11] protocol: introduce protocol extension mechanisms Brandon Williams
2017-10-16 21:25         ` Kevin Daudt
2017-10-16 17:55       ` [PATCH v4 04/11] daemon: recognize hidden request arguments Brandon Williams
2017-10-16 17:55       ` [PATCH v4 05/11] upload-pack, receive-pack: introduce protocol version 1 Brandon Williams
2017-10-16 17:55       ` [PATCH v4 06/11] connect: teach client to recognize v1 server response Brandon Williams
2017-10-16 17:55       ` [PATCH v4 07/11] connect: tell server that the client understands v1 Brandon Williams
2017-10-16 17:55       ` [PATCH v4 08/11] http: " Brandon Williams
2017-10-16 17:55       ` [PATCH v4 09/11] i5700: add interop test for protocol transition Brandon Williams
2017-10-16 17:55       ` [PATCH v4 10/11] ssh: introduce a 'simple' ssh variant Brandon Williams
2017-10-16 17:55       ` [PATCH v4 11/11] Documentation: document Extra Parameters Brandon Williams

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=20170918165615.GE144331@google.com \
    --to=bmwill@google.com \
    --cc=bturner@atlassian.com \
    --cc=git@jeffhostetler.com \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.com \
    --cc=jonathantanmy@google.com \
    --cc=jrnieder@gmail.com \
    --cc=peff@peff.net \
    --cc=sbeller@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.
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).