aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Jason A. Donenfeld <Jason@zx2c4.com>2013-04-09 04:12:19 (JST)
committerGravatar Jason A. Donenfeld <Jason@zx2c4.com>2013-04-09 04:43:26 (JST)
commit8a92df033e974af6338b530a0d78d1bdb0b0f918 (patch)
treeea7968f81170a9ed83b50f544036da78b1b8490c
parentfb3655df3bf85bd405c5921bbd4b3a54c705c839 (diff)
downloadcgit-8a92df033e974af6338b530a0d78d1bdb0b0f918.zip
cgit-8a92df033e974af6338b530a0d78d1bdb0b0f918.tar.gz
Do not load user or system gitconfig and gitattributes
While doing any kind of git loading, unset HOME variables and set NOSYSTEM variables so that cgit does not load any settings that a user may have set for his own /usr/bin/git usage. This fixes a fatal error introduced with git 1.8, whereupon git would fatally exit when failing to access particular files. The result of this is that only repo-local configuration files are accessed: zx2c4@thinkpad ~/Projects/cgit $ HOME=/root QUERY_STRING="url=foo/log" CGIT_CONFIG=tests/trash/cgitrc strace -e access ./cgit >/dev/null access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory) access("repos/foo/.git/objects", X_OK) = 0 access("repos/foo/.git/refs", X_OK) = 0 access("repos/foo/.git/config", R_OK) = 0 access("repos/foo/.git/config", R_OK) = 0 access("repos/foo/.git/objects/b3/bafdbf0183f4897ef8b1319cb8c490ed54717e", F_OK) = 0 access("repos/foo/.git/objects/b3/bafdbf0183f4897ef8b1319cb8c490ed54717e", F_OK) = 0 access("repos/foo/.git/objects/b3/bafdbf0183f4897ef8b1319cb8c490ed54717e", F_OK) = 0 access("repos/foo/.git/objects/b3/bafdbf0183f4897ef8b1319cb8c490ed54717e", F_OK) = 0 +++ exited with 0 +++ Reported-by: Ferry Huberts <ferry.huberts@pelagic.nl> Tested-by: Jason A. Donenfeld <Jason@zx2c4.com> Tested-by: Ferry Huberts <ferry.huberts@pelagic.nl> Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
-rw-r--r--cgit.c24
-rw-r--r--ui-commit.c1
-rw-r--r--ui-log.c1
3 files changed, 24 insertions, 2 deletions
diff --git a/cgit.c b/cgit.c
index f73c7b0..0bf8972 100644
--- a/cgit.c
+++ b/cgit.c
@@ -459,12 +459,36 @@ static char *guess_defbranch(void)
459 459
460static int prepare_repo_cmd(struct cgit_context *ctx) 460static int prepare_repo_cmd(struct cgit_context *ctx)
461{ 461{
462 char *user_home;
463 char *xdg_home;
462 unsigned char sha1[20]; 464 unsigned char sha1[20];
463 int nongit = 0; 465 int nongit = 0;
464 int rc; 466 int rc;
465 467
468 /* The path to the git repository. */
466 setenv("GIT_DIR", ctx->repo->path, 1); 469 setenv("GIT_DIR", ctx->repo->path, 1);
470
471 /* Do not look in /etc/ for gitconfig and gitattributes. */
472 setenv("GIT_CONFIG_NOSYSTEM", "1", 1);
473 setenv("GIT_ATTR_NOSYSTEM", "1", 1);
474
475 /* We unset HOME and XDG_CONFIG_HOME before calling the git setup function
476 * so that we don't make unneccessary filesystem accesses. */
477 user_home = getenv("HOME");
478 xdg_home = getenv("XDG_CONFIG_HOME");
479 unsetenv("HOME");
480 unsetenv("XDG_CONFIG_HOME");
481
482 /* Setup the git directory and initialize the notes system. Both of these
483 * load local configuration from the git repository, so we do them both while
484 * the HOME variables are unset. */
467 setup_git_directory_gently(&nongit); 485 setup_git_directory_gently(&nongit);
486 init_display_notes(NULL);
487
488 /* We restore the unset variables afterward. */
489 setenv("HOME", user_home, 1);
490 setenv("XDG_CONFIG_HOME", xdg_home, 1);
491
468 if (nongit) { 492 if (nongit) {
469 const char *name = ctx->repo->name; 493 const char *name = ctx->repo->name;
470 rc = errno; 494 rc = errno;
diff --git a/ui-commit.c b/ui-commit.c
index 6b41017..a5a6ea8 100644
--- a/ui-commit.c
+++ b/ui-commit.c
@@ -37,7 +37,6 @@ void cgit_print_commit(char *hex, const char *prefix)
37 } 37 }
38 info = cgit_parse_commit(commit); 38 info = cgit_parse_commit(commit);
39 39
40 init_display_notes(NULL);
41 format_display_notes(sha1, &notes, PAGE_ENCODING, 0); 40 format_display_notes(sha1, &notes, PAGE_ENCODING, 0);
42 41
43 load_ref_decorations(DECORATE_FULL_REFS); 42 load_ref_decorations(DECORATE_FULL_REFS);
diff --git a/ui-log.c b/ui-log.c
index 93af0ce..2aa12c3 100644
--- a/ui-log.c
+++ b/ui-log.c
@@ -403,7 +403,6 @@ void cgit_print_log(const char *tip, int ofs, int cnt, char *grep, char *pattern
403 commit->parents = NULL; 403 commit->parents = NULL;
404 } 404 }
405 405
406 init_display_notes(NULL);
407 for (i = 0; i < cnt && (commit = get_revision(&rev)) != NULL; i++) { 406 for (i = 0; i < cnt && (commit = get_revision(&rev)) != NULL; i++) {
408 print_commit(commit, &rev); 407 print_commit(commit, &rev);
409 free(commit->buffer); 408 free(commit->buffer);