cgit: prepare repo before error pages

This fixes a crash when showing a list of all heads in the <select> box
in the header.

Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
This commit is contained in:
Jason A. Donenfeld 2018-02-12 23:23:47 +01:00
parent dbaee2672b
commit 03f6e34bb9

19
cgit.c
View File

@ -561,12 +561,8 @@ static void print_no_repo_clone_urls(const char *url)
html("</a></td></tr>\n"); html("</a></td></tr>\n");
} }
static int prepare_repo_cmd(void) static void prepare_repo_env(int *nongit)
{ {
struct object_id oid;
int nongit = 0;
int rc;
/* The path to the git repository. */ /* The path to the git repository. */
setenv("GIT_DIR", ctx.repo->path, 1); setenv("GIT_DIR", ctx.repo->path, 1);
@ -579,8 +575,13 @@ static int prepare_repo_cmd(void)
/* Setup the git directory and initialize the notes system. Both of these /* Setup the git directory and initialize the notes system. Both of these
* load local configuration from the git repository, so we do them both while * load local configuration from the git repository, so we do them both while
* the HOME variables are unset. */ * the HOME variables are unset. */
setup_git_directory_gently(&nongit); setup_git_directory_gently(nongit);
init_display_notes(NULL); init_display_notes(NULL);
}
static int prepare_repo_cmd(int nongit)
{
struct object_id oid;
int rc;
if (nongit) { if (nongit) {
const char *name = ctx.repo->name; const char *name = ctx.repo->name;
@ -700,6 +701,7 @@ static inline void authenticate_cookie(void)
static void process_request(void) static void process_request(void)
{ {
struct cgit_cmd *cmd; struct cgit_cmd *cmd;
int nongit = 0;
/* If we're not yet authenticated, no matter what page we're on, /* If we're not yet authenticated, no matter what page we're on,
* display the authentication body from the auth_filter. This should * display the authentication body from the auth_filter. This should
@ -715,6 +717,9 @@ static void process_request(void)
return; return;
} }
if (ctx.repo)
prepare_repo_env(&nongit);
cmd = cgit_get_cmd(); cmd = cgit_get_cmd();
if (!cmd) { if (!cmd) {
ctx.page.title = "cgit error"; ctx.page.title = "cgit error";
@ -740,7 +745,7 @@ static void process_request(void)
*/ */
ctx.qry.vpath = cmd->want_vpath ? ctx.qry.path : NULL; ctx.qry.vpath = cmd->want_vpath ? ctx.qry.path : NULL;
if (ctx.repo && prepare_repo_cmd()) if (ctx.repo && prepare_repo_cmd(nongit))
return; return;
cmd->fn(); cmd->fn();