Brandon Williams <[email protected]> writes:
> 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.
It's a bit unclear if that commit _introduced_ a bug, or just
noticed an old bug and documented it in its log message. How does
that commit impact the versons of Git that the updated code is
capable of interracting with?
> +static void parse_extra_args(struct hostinfo *hi, struct argv_array *env,
> + char *extra_args, int buflen)
> +{
> + const char *end = extra_args + buflen;
> + struct strbuf git_protocol = STRBUF_INIT;
> +
> + /* First look for the host argument */
> + extra_args = parse_host_arg(hi, extra_args, buflen);
> +
> + /* Look for additional arguments places after a second NUL byte */
> + 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);
> }