Re: regression: "96b9e0e3 config: treat user and xdg config permission problems as errors" busted git-daemon
- From
Jeff King <peff@peff.net>
- Date
- Apr 11, 2013, 17:24 UTC
- Message-ID
- <20130411172424.GC1255@sigill.intra.peff.net>
- In-Reply-To
- <7vwqs9jd0t.fsf@alter.siamese.dyndns.org>
On Thu, Apr 11, 2013 at 08:35:46AM -0700, Junio C Hamano wrote:
> > Yeah, I think the bug here is that git-daemon should be setting $HOME > > when it switches privileges with --user. Does this patch fix it for you? > [...] > Yeah, that sounds like the obvious fix to me.
Here it is with a commit message.
-- >8 -- Subject: [PATCH] daemon: set HOME when we switch to --user
If git-daemon is invoked with the "--user foo" option, we setuid and setgid to the "foo" user. However, we do not currently touch $HOME or any other environment variables.
This means that a git-daemon (and its git subprocesses) invoked as root will look at ~root/.gitconfig, ~root/.config/git, etc. This is probably not what the admin expected; it would make more sense to load user-wide config from ~foo.
Traditionally this wasn't that big a deal, as most sites do not put config in either homedir (they would use the system-wide /etc/gitconfig if they wanted global config). However, since 96b9e0e (config: treat user and xdg config permission problems as errors, 2012-10-13), it is now an error to try to read from an inaccessible config file (which a file in ~root is very likely to be), meaning that git-daemon will not run at all in such a case.
We can fix this by setting HOME appropriately when we switch users. Note that this is a regression for any site that uses --user but depends on putting config in the $HOME of the user invoking git-daemon. Since the original behavior was never documented, and the new behavior is much more sensible, we can consider this a bugfix.
Reported-by: Mike Galbraith <bitbucket@online.de> Signed-off-by: Jeff King <peff@peff.net> --- I don't have any problem calling this a bugfix and claiming that anyone who was depending on the original behavior is stupid and wrong. But it should probably get a prominent slot in the ReleaseNotes.
daemon.c | 1 + 1 file changed, 1 insertion(+)
diff --git a/daemon.c b/daemon.c index 6aeddcb..a4451fd 100644 --- a/daemon.c +++ b/daemon.c @@ -1091,6 +1091,7 @@ static void drop_privileges(struct credentials *cred) if (cred && (initgroups(cred->pass->pw_name, cred->gid) || setgid (cred->gid) || setuid(cred->pass->pw_uid))) die("cannot drop privileges"); + setenv("HOME", cred->pass->pw_dir, 1); } static struct credentials *prepare_credentials(const char *user_name,
-- 1.8.2.rc0.33.gd915649