Reject '.git' as a tree name in ObjectChecker

Using .git as a name in a tree is invalid for most Git repositories.
This can confuse clients into thinking there is a submodule or another
repository deeper in the tree, which is incorrect.

Change-Id: I90a1eaf25d45e91557f3f548b69cdcd8f7cddce1
This commit is contained in:
Shawn Pearce 2014-03-11 20:12:07 -07:00
parent 77cd1c8cdc
commit 09f513cb37
2 changed files with 30 additions and 4 deletions

View File

@ -1272,6 +1272,19 @@ public void testInvalidTreeNameIsDotDot() {
}
}
@Test
public void testInvalidTreeNameIsGit() {
StringBuilder b = new StringBuilder();
entry(b, "100644 .git");
byte[] data = Constants.encodeASCII(b.toString());
try {
checker.checkTree(data);
fail("incorrectly accepted an invalid tree");
} catch (CorruptObjectException e) {
assertEquals("invalid name '.git'", e.getMessage());
}
}
@Test
public void testInvalidTreeTruncatedInName() {
final StringBuilder b = new StringBuilder();

View File

@ -53,6 +53,7 @@
import org.eclipse.jgit.errors.CorruptObjectException;
import org.eclipse.jgit.internal.JGitText;
import org.eclipse.jgit.util.MutableInteger;
import org.eclipse.jgit.util.RawParseUtils;
/**
* Verifies that an object is formatted correctly.
@ -372,14 +373,26 @@ private static void checkPathSegment(byte[] raw, int ptr, int end)
if (ptr == end)
throw new CorruptObjectException("zero length name");
if (raw[ptr] == '.') {
int nameLen = end - ptr;
if (nameLen == 1)
switch (end - ptr) {
case 1:
throw new CorruptObjectException("invalid name '.'");
if (nameLen == 2 && raw[ptr + 1] == '.')
throw new CorruptObjectException("invalid name '..'");
case 2:
if (raw[ptr + 1] == '.')
throw new CorruptObjectException("invalid name '..'");
break;
case 4:
if (isDotGit(raw, ptr + 1))
throw new CorruptObjectException(String.format(
"invalid name '%s'",
RawParseUtils.decode(raw, ptr, end)));
}
}
}
private static boolean isDotGit(byte[] buf, int p) {
return buf[p] == 'g' && buf[p + 1] == 'i' && buf[p + 2] == 't';
}
/**
* Check a blob for errors.
*