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.
This commit is contained in:
Linus Torvalds 2005-07-05 18:10:59 -07:00
Родитель 319aae2756
Коммит f17a1b1bec
1 изменённых файлов: 10 добавлений и 4 удалений

Просмотреть файл

@ -104,15 +104,13 @@ char *get_index_file(void)
char *git_path(const char *fmt, ...) char *git_path(const char *fmt, ...)
{ {
static char pathname[PATH_MAX]; static char pathname[PATH_MAX], *ret;
va_list args; va_list args;
int len; int len;
if (!git_dir) if (!git_dir)
setup_git_env(); setup_git_env();
len = strlen(git_dir); len = strlen(git_dir);
if (len == 1 && *git_dir == '.')
len = 0;
if (len > PATH_MAX-100) if (len > PATH_MAX-100)
return "pad-path"; return "pad-path";
memcpy(pathname, git_dir, len); memcpy(pathname, git_dir, len);
@ -121,7 +119,15 @@ char *git_path(const char *fmt, ...)
va_start(args, fmt); va_start(args, fmt);
vsnprintf(pathname + len, sizeof(pathname) - len, fmt, args); vsnprintf(pathname + len, sizeof(pathname) - len, fmt, args);
va_end(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) int get_sha1(const char *str, unsigned char *sha1)