Browse Source

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
stable-3.4
Shawn Pearce 11 years ago
parent
commit
09f513cb37
  1. 13
      org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/ObjectCheckerTest.java
  2. 21
      org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectChecker.java

13
org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/ObjectCheckerTest.java

@ -1272,6 +1272,19 @@ public class ObjectCheckerTest {
}
}
@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();

21
org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectChecker.java

@ -53,6 +53,7 @@ import java.text.MessageFormat;
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 @@ public class ObjectChecker {
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.
*

Loading…
Cancel
Save