From 1770c92fadf2b212076d40ff7285093e56e9502b Mon Sep 17 00:00:00 2001 From: "Shawn O. Pearce" Date: Thu, 30 Oct 2008 10:46:25 -0700 Subject: [PATCH] Don't permit '.' or '..' in tree entries A Git tree must not have '.' or '..' within the structure as these names are reserved in every directory by the client operating system. Signed-off-by: Shawn O. Pearce Signed-off-by: Robin Rosenberg --- .../org/spearce/jgit/lib/ObjectCheckerTest.java | 31 ++++++++++++++++++++++ .../src/org/spearce/jgit/lib/ObjectChecker.java | 7 +++++ 2 files changed, 38 insertions(+) diff --git a/org.spearce.jgit.test/tst/org/spearce/jgit/lib/ObjectCheckerTest.java b/org.spearce.jgit.test/tst/org/spearce/jgit/lib/ObjectCheckerTest.java index fa37fb50..7befde87 100644 --- a/org.spearce.jgit.test/tst/org/spearce/jgit/lib/ObjectCheckerTest.java +++ b/org.spearce.jgit.test/tst/org/spearce/jgit/lib/ObjectCheckerTest.java @@ -980,6 +980,13 @@ public class ObjectCheckerTest extends TestCase { checker.checkTree(data); } + public void testValidTree6() throws CorruptObjectException { + final StringBuilder b = new StringBuilder(); + entry(b, "100644 .a"); + final byte[] data = Constants.encodeASCII(b.toString()); + checker.checkTree(data); + } + public void testValidTreeSorting1() throws CorruptObjectException { final StringBuilder b = new StringBuilder(); entry(b, "100644 fooaaa"); @@ -1166,6 +1173,30 @@ public class ObjectCheckerTest extends TestCase { } } + public void testInvalidTreeNameIsDot() { + final StringBuilder b = new StringBuilder(); + entry(b, "100644 ."); + final byte[] data = Constants.encodeASCII(b.toString()); + try { + checker.checkTree(data); + fail("incorrectly accepted an invalid tree"); + } catch (CorruptObjectException e) { + assertEquals("invalid name '.'", e.getMessage()); + } + } + + public void testInvalidTreeNameIsDotDot() { + final StringBuilder b = new StringBuilder(); + entry(b, "100644 .."); + final byte[] data = Constants.encodeASCII(b.toString()); + try { + checker.checkTree(data); + fail("incorrectly accepted an invalid tree"); + } catch (CorruptObjectException e) { + assertEquals("invalid name '..'", e.getMessage()); + } + } + public void testInvalidTreeTruncatedInName() { final StringBuilder b = new StringBuilder(); b.append("100644 b"); diff --git a/org.spearce.jgit/src/org/spearce/jgit/lib/ObjectChecker.java b/org.spearce.jgit/src/org/spearce/jgit/lib/ObjectChecker.java index d4031195..b303d6f2 100644 --- a/org.spearce.jgit/src/org/spearce/jgit/lib/ObjectChecker.java +++ b/org.spearce.jgit/src/org/spearce/jgit/lib/ObjectChecker.java @@ -318,6 +318,13 @@ public class ObjectChecker { } if (thisNameB + 1 == ptr) throw new CorruptObjectException("zero length name"); + if (raw[thisNameB] == '.') { + final int nameLen = (ptr - 1) - thisNameB; + if (nameLen == 1) + throw new CorruptObjectException("invalid name '.'"); + if (nameLen == 2 && raw[thisNameB + 1] == '.') + throw new CorruptObjectException("invalid name '..'"); + } if (duplicateName(raw, thisNameB, ptr - 1)) throw new CorruptObjectException("duplicate entry names"); -- 2.11.4.GIT