Browse Source

Permit ObjectChecker to optionally accept leading '0' in trees

The leading '0' is a broken mode that although incorrect in the
Git canonical tree format was created by a couple of libraries
frequently used on a popular Git hosting site. Some projects have
these modes stuck in their ancient history and cannot easily
repair the damage without a full history rewrite. Optionally permit
ObjectChecker to ignore them.

Bug: 307291
Change-Id: Ib921dfd77ce757e89280d1c00328a88430daef35
stable-3.4
Shawn Pearce 11 years ago
parent
commit
2f1bd3618d
  1. 8
      org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/ObjectCheckerTest.java
  2. 21
      org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectChecker.java

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

@ -1108,6 +1108,14 @@ public class ObjectCheckerTest {
checker.checkTree(data);
}
@Test
public void testAcceptTreeModeWithZero() throws CorruptObjectException {
StringBuilder b = new StringBuilder();
entry(b, "040000 a");
checker.setAllowLeadingZeroFileMode(true);
checker.checkTree(Constants.encodeASCII(b.toString()));
}
@Test
public void testInvalidTreeModeStartsWithZero1() {
final StringBuilder b = new StringBuilder();

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

@ -97,6 +97,25 @@ public class ObjectChecker {
private final MutableInteger ptrout = new MutableInteger();
private boolean allowZeroMode;
/**
* Enable accepting leading zero mode in tree entries.
* <p>
* Some broken Git libraries generated leading zeros in the mode part of
* tree entries. This is technically incorrect but gracefully allowed by
* git-core. JGit rejects such trees by default, but may need to accept
* them on broken histories.
*
* @param allow allow leading zero mode.
* @return {@code this}.
* @since 3.4
*/
public ObjectChecker setAllowLeadingZeroFileMode(boolean allow) {
allowZeroMode = allow;
return this;
}
/**
* Check an object for parsing errors.
*
@ -308,7 +327,7 @@ public class ObjectChecker {
break;
if (c < '0' || c > '7')
throw new CorruptObjectException("invalid mode character");
if (thisMode == 0 && c == '0')
if (thisMode == 0 && c == '0' && !allowZeroMode)
throw new CorruptObjectException("mode starts with '0'");
thisMode <<= 3;
thisMode += c - '0';

Loading…
Cancel
Save