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) {