From 9ae7d493c45c0cd7243209e004901308816abaf3 Mon Sep 17 00:00:00 2001 From: Shawn Pearce Date: Thu, 25 Aug 2016 18:59:15 -0700 Subject: [PATCH] DfsReader: check object type during open Do not open an OBJ_TREE if the caller is expecting an OBJ_BLOB or OBJ_COMMIT; instead throw IncorrectObjectTypeException. This better matches behavior of WindowCursor, the ObjectReader implementation of the local file based object store. Change-Id: I3fb0e77f54895b123679a405e1b6ba5b95752ff0 --- .../jgit/internal/storage/dfs/DfsInserter.java | 4 ++++ .../jgit/internal/storage/dfs/DfsReader.java | 17 +++++++++++++---- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsInserter.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsInserter.java index c57c41741..a5e920a75 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsInserter.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsInserter.java @@ -69,6 +69,7 @@ import java.util.zip.InflaterInputStream; import org.eclipse.jgit.errors.CorruptObjectException; +import org.eclipse.jgit.errors.IncorrectObjectTypeException; import org.eclipse.jgit.errors.LargeObjectException; import org.eclipse.jgit.internal.JGitText; import org.eclipse.jgit.internal.storage.file.PackIndex; @@ -570,6 +571,9 @@ public ObjectLoader open(AnyObjectId objectId, int typeHint) if (type == OBJ_OFS_DELTA || type == OBJ_REF_DELTA) throw new IOException(MessageFormat.format( DfsText.get().cannotReadBackDelta, Integer.toString(type))); + if (typeHint != OBJ_ANY && type != typeHint) { + throw new IncorrectObjectTypeException(objectId.copy(), typeHint); + } long sz = c & 0x0f; int ptr = 1; diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsReader.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsReader.java index cc2f35003..2f61dea0d 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsReader.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsReader.java @@ -222,20 +222,21 @@ public ObjectLoader open(AnyObjectId objectId, int typeHint) ObjectLoader ldr; if (last != null) { ldr = last.get(this, objectId); - if (ldr != null) - return ldr; + if (ldr != null) { + return checkType(ldr, objectId, typeHint); + } } PackList packList = db.getPackList(); boolean noGarbage = avoidUnreachable; ldr = openImpl(packList, objectId, noGarbage); if (ldr != null) { - return ldr; + return checkType(ldr, objectId, typeHint); } if (packList.dirty()) { ldr = openImpl(db.scanPacks(packList), objectId, noGarbage); if (ldr != null) { - return ldr; + return checkType(ldr, objectId, typeHint); } } @@ -245,6 +246,14 @@ public ObjectLoader open(AnyObjectId objectId, int typeHint) throw new MissingObjectException(objectId.copy(), typeHint); } + private static ObjectLoader checkType(ObjectLoader ldr, AnyObjectId id, + int typeHint) throws IncorrectObjectTypeException { + if (typeHint != OBJ_ANY && ldr.getType() != typeHint) { + throw new IncorrectObjectTypeException(id.copy(), typeHint); + } + return ldr; + } + private ObjectLoader openImpl(PackList packList, AnyObjectId objectId, boolean noGarbage) throws IOException { for (DfsPackFile pack : packList.packs) {