From: Omar Polo Subject: Re: dial fix for git-shell To: Stefan Sperling Cc: gameoftrees@openbsd.org Date: Sat, 18 Feb 2023 17:15:38 +0100 On 2023/02/18 16:50:50 +0100, Stefan Sperling wrote: > On Sat, Feb 18, 2023 at 03:30:59PM +0100, Stefan Sperling wrote: > > This might be needed to make 'got clone' and 'got fetch' work > > for people who use git-shell as a login shell. > > > > pass git-{upload,receive}-pack and repository path as one argument to ssh(1) > > Apparent git-shell expects single-quotes around the repository path. > Very quirky, but I am willing to accommodate for it... > > Does this work? > > diff f990756a3987ba6410baf611d561e9b8f285f047 b7785e3dc70cb13011efd95a48fa6d711a7e40e7 > commit - f990756a3987ba6410baf611d561e9b8f285f047 > commit + b7785e3dc70cb13011efd95a48fa6d711a7e40e7 > blob - 3325c8994f55721d8588155cdc72b95d11fd2248 > blob + ee259709c5574347c0f8cf0240d326da426a1ca1 > --- lib/dial.c > +++ lib/dial.c > @@ -26,6 +26,7 @@ > #include > #include > #include > +#include > > #include "got_error.h" > #include "got_path.h" > @@ -206,8 +207,8 @@ got_dial_ssh(pid_t *newpid, int *newfd, const char *ho > { > const struct got_error *error = NULL; > int pid, pfd[2]; > - char cmd[64]; > - const char *argv[11]; > + char cmd[64 + PATH_MAX]; > + const char *argv[10]; > int i = 0, j; > > *newpid = -1; > @@ -228,7 +229,6 @@ got_dial_ssh(pid_t *newpid, int *newfd, const char *ho > argv[i++] = "--"; > argv[i++] = (char *)host; > argv[i++] = (char *)cmd; > - argv[i++] = (char *)path; > argv[i++] = NULL; > assert(i <= nitems(argv)); > > @@ -249,7 +249,8 @@ got_dial_ssh(pid_t *newpid, int *newfd, const char *ho > err(1, "dup2"); > if (dup2(pfd[0], 1) == -1) > err(1, "dup2"); > - n = snprintf(cmd, sizeof(cmd), "git-%s-pack", direction); > + n = snprintf(cmd, sizeof(cmd), "git-%s-pack '%s'", > + direction, path); since we're apparently in the quoting business I guess we may need something more robust that handles paths with ' in them. Maybe this is the reason git-shell is so picky. could be even done as a separate step, fwiw ok op@ if you want to just commit this. > if (n < 0 || n >= ssizeof(cmd)) > err(1, "snprintf"); > if (execv(GOT_DIAL_PATH_SSH, (char *const *)argv) == -1)