Browse Source
PackWriter.writeObject() can get into an infinite loop when corrupt packs are present. When it finds a pack file with an object that can be reused it calls DfsPackFile.copyAsIs(). If that method sees an invalid CRC, it adds the object to the DfsPackFile's corrupt object list and throws a CorruptObjectException, which it later catches as an IOException and wraps in a StoredObjectRepresentationNotAvailableException. PackWriter.writeObjectImpl() catches that SORNAE and retries the operation by calling DfsReader.selectObjectRepresentation(). But currently that method returns the same object which was just seen to be corrupt. Change DfsPackFile.isCorrupt() from private to package private, and use that method in DfsReader.selectObjectRepresentation() to filter out corrupt objects. The stack traces that show the problem are: org.eclipse.jgit.errors.CorruptObjectException.<init>(CorruptObjectException.java:113) org.eclipse.jgit.internal.storage.dfs.DfsPackFile.copyAsIs(DfsPackFile.java:624) org.eclipse.jgit.internal.storage.dfs.DfsReader.copyObjectAsIs(DfsReader.java:491) org.eclipse.jgit.internal.storage.pack.PackWriter.writeObjectImpl(PackWriter.java:1478) org.eclipse.jgit.internal.storage.pack.PackWriter.writeObject(PackWriter.java:1455) org.eclipse.jgit.internal.storage.dfs.DfsPackFile.getPackIndex(DfsPackFile.java:228) org.eclipse.jgit.internal.storage.dfs.DfsReader.findAllFromPack(DfsReader.java:476) org.eclipse.jgit.internal.storage.dfs.DfsReader.selectObjectRepresentation(DfsReader.java:455) org.eclipse.jgit.internal.storage.pack.PackWriter.writeObjectImpl(PackWriter.java:1492) org.eclipse.jgit.internal.storage.pack.PackWriter.writeObject(PackWriter.java:1455) Change-Id: Iad7bbcaed1f11a6aa3b4f5af911a73a34c0fabfd Signed-off-by: Terry Parker <tparker@google.com>stable-4.4
Terry Parker
9 years ago
2 changed files with 2 additions and 2 deletions
Loading…
Reference in new issue