Merge branch 'lt/dirwalk' into next
* lt/dirwalk: Prevent bogus paths from being added to the index.
This commit is contained in:
@ -245,70 +245,6 @@ static int refresh_cache(int really)
|
||||
return has_errors;
|
||||
}
|
||||
|
||||
/*
|
||||
* We fundamentally don't like some paths: we don't want
|
||||
* dot or dot-dot anywhere, and for obvious reasons don't
|
||||
* want to recurse into ".git" either.
|
||||
*
|
||||
* Also, we don't want double slashes or slashes at the
|
||||
* 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(const char *path)
|
||||
{
|
||||
char c;
|
||||
|
||||
goto inside;
|
||||
for (;;) {
|
||||
if (!c)
|
||||
return 1;
|
||||
if (c == '/') {
|
||||
inside:
|
||||
c = *path++;
|
||||
switch (c) {
|
||||
default:
|
||||
continue;
|
||||
case '/': case '\0':
|
||||
break;
|
||||
case '.':
|
||||
if (verify_dotfile(path))
|
||||
continue;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
c = *path++;
|
||||
}
|
||||
}
|
||||
|
||||
static int add_cacheinfo(unsigned int mode, const unsigned char *sha1,
|
||||
const char *path, int stage)
|
||||
{
|
||||
|
Reference in New Issue
Block a user