]> source.dussan.org Git - jgit.git/commit
Fix crashes on rare combination of file names 11/194411/31
authorDmitrii Filippov <dmfilippov@google.com>
Mon, 27 Jun 2022 18:03:53 +0000 (20:03 +0200)
committerHan-Wen NIenhuys <hanwen@google.com>
Thu, 3 Nov 2022 18:09:56 +0000 (14:09 -0400)
commit1e04046a6d22b55e6bc642d7cd4181feee9cf6af
treea58ac071b39a7e1a92543ef4326eef28384efb62
parente7adcac9f3dec697e26ef6fc0bfd300d68a0935e
Fix crashes on rare combination of file names

The NameConflictTreeWalk class is used in merge for iterating over
entries in commits. The class uses a separate iterator for each
commit's tree. In rare cases it can incorrectly report the same entry
twice. As a result, duplicated entries are added to the merge result
and later jgit throws an exception when it tries to process merge
result.

The problem appears only when there is a directory-file conflict for
the last item in trees. Example from the bug:
Commit 1:
* subtree - file
* subtree-0 - file
Commit 2:
* subtree - directory
* subtree-0 - file
Here the names are ordered like this:
"subtree" file <"subtree-0" file < "subtree" directory.

The NameConflictTreeWalk handles similar cases correctly if there are
other files after subtree... in commits - this is processed in the
AbstractTreeIterator.min function. Existing code has a special
optimization for the case, when all trees are pointed to the same
entry name - it skips additional checks. However, this optimization
incorrectly skips checks if one of trees reached the end.

The fix processes a situation when some trees reached the end, while
others are still point to an entry.

bug: 535919
Change-Id: I62fde3dd89779fac282479c093400448b4ac5c86
org.eclipse.jgit.test/tst/org/eclipse/jgit/merge/MergerTest.java
org.eclipse.jgit.test/tst/org/eclipse/jgit/treewalk/NameConflictTreeWalkTest.java
org.eclipse.jgit/src/org/eclipse/jgit/treewalk/NameConflictTreeWalk.java