diff options
author | Shawn Pearce <spearce@spearce.org> | 2014-04-03 10:24:49 -0700 |
---|---|---|
committer | Shawn Pearce <spearce@spearce.org> | 2014-04-03 11:15:25 -0700 |
commit | 94330d9cb521e9074ac3d3b4c9a985561e636b5d (patch) | |
tree | 2cc8e79a0574f6765a82904295dbfd402515874d | |
parent | 39904d6ad4c8aad79be11fff27d96b9d1698e26b (diff) | |
download | jgit-94330d9cb521e9074ac3d3b4c9a985561e636b5d.tar.gz jgit-94330d9cb521e9074ac3d3b4c9a985561e636b5d.zip |
Fix ObjectChecker when normalization is enabled
When safeForMacOS is enabled the checker verifies a name does not
match against another name in the same tree after normalization to
NFC. The check was incorrect and failed when the first name was put
in, rejecting simple trees containing only one file like "F".
Add a test for this simple tree to verify it is accepted.
Fix the test for NFC normalization to actually normalize
and have a collision.
Change-Id: I39e7d71150948872bff6cd2b06bf8dae52aa3c33
-rw-r--r-- | org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/ObjectCheckerTest.java | 13 | ||||
-rw-r--r-- | org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectChecker.java | 2 |
2 files changed, 12 insertions, 3 deletions
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 3f58b7501f..9fc7fca987 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 @@ -1493,8 +1493,8 @@ public class ObjectCheckerTest { } StringBuilder b = new StringBuilder(); - entry(b, "100644 \u00C1"); - entry(b, "100644 \u004a\u0301"); + entry(b, "100644 \u0065\u0301"); + entry(b, "100644 \u00e9"); byte[] data = b.toString().getBytes("UTF-8"); try { checker.setSafeForMacOS(true); @@ -1506,6 +1506,15 @@ public class ObjectCheckerTest { } @Test + public void testInvalidTreeDuplicateNames8() + throws UnsupportedEncodingException, CorruptObjectException { + StringBuilder b = new StringBuilder(); + entry(b, "100644 A"); + checker.setSafeForMacOS(true); + checker.checkTree(b.toString().getBytes("UTF-8")); + } + + @Test public void testRejectNulInPathSegment() { try { checker.checkPathSegment(Constants.encodeASCII("a\u0000b"), 0, 3); 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 1b135a924c..d8a70c104f 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectChecker.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/ObjectChecker.java @@ -382,7 +382,7 @@ public class ObjectChecker { throw new CorruptObjectException("truncated in name"); checkPathSegment2(raw, thisNameB, ptr); if (normalized != null) { - if (normalized.add(normalize(raw, thisNameB, ptr))) + if (!normalized.add(normalize(raw, thisNameB, ptr))) throw new CorruptObjectException("duplicate entry names"); } else if (duplicateName(raw, thisNameB, ptr)) throw new CorruptObjectException("duplicate entry names"); |