|
|
@@ -76,6 +76,7 @@ import org.eclipse.jgit.treewalk.WorkingTreeOptions; |
|
|
|
import org.eclipse.jgit.treewalk.filter.PathFilter; |
|
|
|
import org.eclipse.jgit.util.FS; |
|
|
|
import org.eclipse.jgit.util.FileUtils; |
|
|
|
import org.eclipse.jgit.util.RawParseUtils; |
|
|
|
import org.eclipse.jgit.util.SystemReader; |
|
|
|
import org.eclipse.jgit.util.io.AutoCRLFOutputStream; |
|
|
|
|
|
|
@@ -306,8 +307,7 @@ public class DirCacheCheckout { |
|
|
|
void processEntry(CanonicalTreeParser m, DirCacheBuildIterator i, |
|
|
|
WorkingTreeIterator f) throws IOException { |
|
|
|
if (m != null) { |
|
|
|
if (!isValidPath(m)) |
|
|
|
throw new InvalidPathException(m.getEntryPathString()); |
|
|
|
checkValidPath(m); |
|
|
|
// There is an entry in the merge commit. Means: we want to update |
|
|
|
// what's currently in the index and working-tree to that one |
|
|
|
if (i == null) { |
|
|
@@ -522,8 +522,8 @@ public class DirCacheCheckout { |
|
|
|
|
|
|
|
String name = walk.getPathString(); |
|
|
|
|
|
|
|
if (m != null && !isValidPath(m)) |
|
|
|
throw new InvalidPathException(m.getEntryPathString()); |
|
|
|
if (m != null) |
|
|
|
checkValidPath(m); |
|
|
|
|
|
|
|
if (i == null && m == null && h == null) { |
|
|
|
// File/Directory conflict case #20 |
|
|
@@ -1157,14 +1157,14 @@ public class DirCacheCheckout { |
|
|
|
forbidden[i] = Constants.encodeASCII(list[i]); |
|
|
|
} |
|
|
|
|
|
|
|
private static boolean isValidPath(CanonicalTreeParser t) { |
|
|
|
private static void checkValidPath(CanonicalTreeParser t) |
|
|
|
throws InvalidPathException { |
|
|
|
for (CanonicalTreeParser i = t; i != null; i = i.getParent()) |
|
|
|
if (!isValidPathSegment(i)) |
|
|
|
return false; |
|
|
|
return true; |
|
|
|
checkValidPathSegment(i); |
|
|
|
} |
|
|
|
|
|
|
|
private static boolean isValidPathSegment(CanonicalTreeParser t) { |
|
|
|
private static void checkValidPathSegment(CanonicalTreeParser t) |
|
|
|
throws InvalidPathException { |
|
|
|
boolean isWindows = SystemReader.getInstance().isWindows(); |
|
|
|
boolean isOSX = SystemReader.getInstance().isMacOS(); |
|
|
|
boolean ignCase = isOSX || isWindows; |
|
|
@@ -1177,23 +1177,29 @@ public class DirCacheCheckout { |
|
|
|
int start = ptr; |
|
|
|
while (ptr < end) { |
|
|
|
if (raw[ptr] == '/') |
|
|
|
return false; |
|
|
|
throw new InvalidPathException( |
|
|
|
JGitText.get().invalidPathContainsSeparator, |
|
|
|
"/", t.getEntryPathString()); //$NON-NLS-1$ |
|
|
|
if (isWindows) { |
|
|
|
if (raw[ptr] == '\\') |
|
|
|
return false; |
|
|
|
throw new InvalidPathException( |
|
|
|
JGitText.get().invalidPathContainsSeparator, |
|
|
|
"\\", t.getEntryPathString()); //$NON-NLS-1$ |
|
|
|
if (raw[ptr] == ':') |
|
|
|
return false; |
|
|
|
throw new InvalidPathException( |
|
|
|
JGitText.get().invalidPathContainsSeparator, |
|
|
|
":", t.getEntryPathString()); //$NON-NLS-1$ |
|
|
|
} |
|
|
|
ptr++; |
|
|
|
} |
|
|
|
// '.' and '.'' are invalid here |
|
|
|
// '.' and '..' are invalid here |
|
|
|
if (ptr - start == 1) { |
|
|
|
if (raw[start] == '.') |
|
|
|
return false; |
|
|
|
throw new InvalidPathException(t.getEntryPathString()); |
|
|
|
} else if (ptr - start == 2) { |
|
|
|
if (raw[start] == '.') |
|
|
|
if (raw[start + 1] == '.') |
|
|
|
return false; |
|
|
|
throw new InvalidPathException(t.getEntryPathString()); |
|
|
|
} else if (ptr - start == 4) { |
|
|
|
// .git (possibly case insensitive) is disallowed |
|
|
|
if (raw[start] == '.') |
|
|
@@ -1202,15 +1208,24 @@ public class DirCacheCheckout { |
|
|
|
|| (ignCase && raw[start + 2] == 'I')) |
|
|
|
if (raw[start + 3] == 't' |
|
|
|
|| (ignCase && raw[start + 3] == 'T')) |
|
|
|
return false; |
|
|
|
throw new InvalidPathException( |
|
|
|
t.getEntryPathString()); |
|
|
|
} |
|
|
|
if (isWindows) { |
|
|
|
// Space or period at end of file name is ignored by Windows. |
|
|
|
// Treat this as a bad path for now. We may want to handle |
|
|
|
// this as case insensitivity in the future. |
|
|
|
if (ptr > 0) |
|
|
|
if (raw[ptr - 1] == '.' || raw[ptr - 1] == ' ') |
|
|
|
return false; |
|
|
|
if (ptr > 0) { |
|
|
|
if (raw[ptr - 1] == '.') |
|
|
|
throw new InvalidPathException( |
|
|
|
JGitText.get().invalidPathPeriodAtEndWindows, |
|
|
|
t.getEntryPathString()); |
|
|
|
if (raw[ptr - 1] == ' ') |
|
|
|
throw new InvalidPathException( |
|
|
|
JGitText.get().invalidPathSpaceAtEndWindows, |
|
|
|
t.getEntryPathString()); |
|
|
|
} |
|
|
|
|
|
|
|
int i; |
|
|
|
// Bad names, eliminate suffix first |
|
|
|
for (i = start; i < ptr; ++i) |
|
|
@@ -1228,13 +1243,14 @@ public class DirCacheCheckout { |
|
|
|
break; |
|
|
|
} |
|
|
|
if (k == len) |
|
|
|
return false; |
|
|
|
throw new InvalidPathException( |
|
|
|
JGitText.get().invalidPathReservedOnWindows, |
|
|
|
RawParseUtils.decode(forbidden[j]), t |
|
|
|
.getEntryPathString()); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
return true; |
|
|
|
} |
|
|
|
|
|
|
|
private static byte toUpper(byte b) { |