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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.