git-update-cache: allow dot-files
We still refuse to add ".", ".." and ".git". In theory, you could track another git-repository by allowing ".git", but the potential for confusion is just too high.
This commit is contained in:
parent
c4bd907d95
commit
320d3a1b1a
@ -238,13 +238,42 @@ static int refresh_cache(void)
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* We fundamentally don't like some paths: we don't want
|
* We fundamentally don't like some paths: we don't want
|
||||||
* dot or dot-dot anywhere, and in fact, we don't even want
|
* dot or dot-dot anywhere, and for obvious reasons don't
|
||||||
* any other dot-files (.git or anything else). They
|
* want to recurse into ".git" either.
|
||||||
* are hidden, for chist sake.
|
|
||||||
*
|
*
|
||||||
* Also, we don't want double slashes or slashes at the
|
* Also, we don't want double slashes or slashes at the
|
||||||
* end that can make pathnames ambiguous.
|
* end that can make pathnames ambiguous.
|
||||||
*/
|
*/
|
||||||
|
static int verify_dotfile(const char *rest)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* The first character was '.', but that
|
||||||
|
* has already been discarded, we now test
|
||||||
|
* the rest.
|
||||||
|
*/
|
||||||
|
switch (*rest) {
|
||||||
|
/* "." is not allowed */
|
||||||
|
case '\0': case '/':
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ".git" followed by NUL or slash is bad. This
|
||||||
|
* shares the path end test with the ".." case.
|
||||||
|
*/
|
||||||
|
case 'g':
|
||||||
|
if (rest[1] != 'i')
|
||||||
|
break;
|
||||||
|
if (rest[2] != 't')
|
||||||
|
break;
|
||||||
|
rest += 2;
|
||||||
|
/* fallthrough */
|
||||||
|
case '.':
|
||||||
|
if (rest[1] == '\0' || rest[1] == '/')
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
static int verify_path(char *path)
|
static int verify_path(char *path)
|
||||||
{
|
{
|
||||||
char c;
|
char c;
|
||||||
@ -256,8 +285,15 @@ static int verify_path(char *path)
|
|||||||
if (c == '/') {
|
if (c == '/') {
|
||||||
inside:
|
inside:
|
||||||
c = *path++;
|
c = *path++;
|
||||||
if (c != '/' && c != '.' && c != '\0')
|
switch (c) {
|
||||||
|
default:
|
||||||
continue;
|
continue;
|
||||||
|
case '/': case '\0':
|
||||||
|
break;
|
||||||
|
case '.':
|
||||||
|
if (verify_dotfile(path))
|
||||||
|
continue;
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
c = *path++;
|
c = *path++;
|
||||||
|
Loading…
Reference in New Issue
Block a user