From: Linus Torvalds Date: Wed, 6 Jul 2005 01:10:59 +0000 (-0700) Subject: Fix up path-cleanup in git_path() properly X-Git-Tag: v0.99~61 X-Git-Url: https://git.verplant.org/?a=commitdiff_plain;h=f17a1b1bec5cef1d39521aac92f94858acda6433;p=git.git 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. --- diff --git a/sha1_file.c b/sha1_file.c index 74dc2aab..bbb749c5 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)