From 2f1bd3618da20886b12b8132e9307bc61f5fe039 Mon Sep 17 00:00:00 2001 From: Shawn Pearce Date: Tue, 11 Mar 2014 17:19:37 -0700 Subject: [PATCH] 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 --- .../eclipse/jgit/lib/ObjectCheckerTest.java | 8 +++++++ .../org/eclipse/jgit/lib/ObjectChecker.java | 21 ++++++++++++++++++- 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/ObjectCheckerTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/ObjectCheckerTest.java index 380defaa0..4a4e349cf 100644 --- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/ObjectCheckerTest.java +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/ObjectCheckerTest.java @@ -1108,6 +1108,14 @@ public void testValidTreeSorting8() throws CorruptObjectException { 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(); diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectChecker.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectChecker.java index bb67befae..14cb52898 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectChecker.java +++ b/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. + *

+ * 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 void checkTree(final byte[] raw) throws CorruptObjectException { 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';