зеркало из 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, ...)
|
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)
|
||||||
|
|
Загрузка…
Ссылка в новой задаче