From f17a1b1bec5cef1d39521aac92f94858acda6433 Mon Sep 17 00:00:00 2001
From: Linus Torvalds <torvalds@g5.osdl.org>
Date: Tue, 5 Jul 2005 18:10:59 -0700
Subject: [PATCH] Fix up path-cleanup in git_path() properly

GIT_DIR=.  ends up being what some of the pack senders use, and we
sometimes messed up when cleaning up the path, ie a ".//HEAD" was
cleaned up into "/HEAD", not "HEAD" like it should be.

We should do some other cleanup, and probably also verify that symlinks
don't point to outside the git area.
---
 sha1_file.c | 14 ++++++++++----
 1 file changed, 10 insertions(+), 4 deletions(-)

diff --git a/sha1_file.c b/sha1_file.c
index 74dc2aab26c..bbb749c561e 100644
--- a/sha1_file.c
+++ b/sha1_file.c
@@ -104,15 +104,13 @@ char *get_index_file(void)
 
 char *git_path(const char *fmt, ...)
 {
-	static char pathname[PATH_MAX];
+	static char pathname[PATH_MAX], *ret;
 	va_list args;
 	int len;
 
 	if (!git_dir)
 		setup_git_env();
 	len = strlen(git_dir);
-	if (len == 1 && *git_dir == '.')
-		len = 0;
 	if (len > PATH_MAX-100)
 		return "pad-path";
 	memcpy(pathname, git_dir, len);
@@ -121,7 +119,15 @@ char *git_path(const char *fmt, ...)
 	va_start(args, fmt);
 	vsnprintf(pathname + len, sizeof(pathname) - len, fmt, args);
 	va_end(args);
-	return pathname;
+	ret = pathname;
+
+	/* Clean it up */
+	if (!memcmp(pathname, "./", 2)) {
+		ret += 2;
+		while (*ret == '/')
+			ret++;
+	}
+	return ret;
 }
 
 int get_sha1(const char *str, unsigned char *sha1)