зеркало из https://github.com/microsoft/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.
This commit is contained in:
Родитель
319aae2756
Коммит
f17a1b1bec
14
sha1_file.c
14
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)
|
||||
|
|
Загрузка…
Ссылка в новой задаче