From 94330d9cb521e9074ac3d3b4c9a985561e636b5d Mon Sep 17 00:00:00 2001 From: Shawn Pearce Date: Thu, 3 Apr 2014 10:24:49 -0700 Subject: [PATCH] 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 --- .../tst/org/eclipse/jgit/lib/ObjectCheckerTest.java | 13 +++++++++++-- .../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 3f58b7501..9fc7fca98 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); @@ -1505,6 +1505,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 { 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 1b135a924..d8a70c104 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");