aboutsummaryrefslogtreecommitdiffstats
path: root/cgit.c
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 /cgit.c
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>
Diffstat (limited to 'cgit.c')
-rw-r--r--cgit.c24
1 files changed, 24 insertions, 0 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;