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
next prev parent 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).