Download raw body.
make gitwrapper ignore "realpath: permission denied"
On 2023/07/07 14:42:31 +0200, Stefan Sperling <stsp@stsp.name> wrote: > I came across this misbehaviour of gitwrapper while setting up > a private repository to be served by gotd. > > ok? ok op@ some comments inline however. > --- gotd/parse.y > +++ gotd/parse.y > @@ -312,16 +314,28 @@ repoopts1 : PATH STRING { > YYERROR; > } > if (realpath($2, new_repo->path) == NULL) { > - yyerror("realpath %s: %s", $2, > - strerror(errno)); > /* > - * Give admin a chance to create > - * missing repositories at run-time. > + * To give admins a chance to create > + * missing repositories at run-time > + * we only warn about ENOENT here. not a problem of this diff, but this comment is wrong. % cat >test.conf repository foo { path '/oops.git' permit rw op } % doas /usr/local/sbin/gotd -d -f ./test.conf gotd: ./test.conf:2: realpath /oops.git: No such file or directory % echo $? 1 > + * > + * And ignore 'permission denied' when > + * running in gitwrapper. Users may be > + * able to access this repository via > + * gotd regardless. > */ > - if (errno != ENOENT) { > + if (errno == ENOENT) { > + yyerror("realpath %s: %s", $2, > + strerror(errno)); this however works because gitwrapper doesn't check parse_config() return value. (yyerror() bumps file->errors, which is then inspected by parse_config().) i'm starting to think that we should use log.c for these messages, and bump file->errors if we think it's worth. The upside would be that we stop writing to fd 2 on error (which i'm not sure if could cause issues when reloading the config.) > + } else if (errno != EACCES || > + gotd_proc_id != PROC_GITWRAPPER) { > + yyerror("realpath %s: %s", $2, > + strerror(errno)); > free($2); > YYERROR; > - } else if (strlcpy(new_repo->path, $2, > + } > + > + if (strlcpy(new_repo->path, $2, > sizeof(new_repo->path)) >= > sizeof(new_repo->path)) > yyerror("path too long"); > @@ -740,10 +754,11 @@ parse_config(const char *filename, enum gotd_procid pr > > int > parse_config(const char *filename, enum gotd_procid proc_id, > - struct gotd *env, int require_config_file) > + struct gotd *env) > { > struct sym *sym, *next; > struct gotd_repo *repo; > + int require_config_file = (proc_id == PROC_GITWRAPPER ? 0 : 1); not really an issue, but made me raise an eyebrow. I'd rewrite it as int require_config_file = (proc_id != PROC_GITWRAPPER) or something more verbose along the lines of int require_config_file = 1; if (proc_id == PROC_GITWRAPPER) require_config_file = 0; your call however.
make gitwrapper ignore "realpath: permission denied"