diff options
author | Shawn Pearce <spearce@spearce.org> | 2016-08-25 18:59:15 -0700 |
---|---|---|
committer | Shawn Pearce <spearce@spearce.org> | 2016-08-25 19:17:09 -0700 |
commit | 9ae7d493c45c0cd7243209e004901308816abaf3 (patch) | |
tree | 80dac67fb56778421ba977f9c7db9f5e2b4d816a | |
parent | 1836a7b273b63d6e217e5b58322cb1a079517101 (diff) | |
download | jgit-9ae7d493c45c0cd7243209e004901308816abaf3.tar.gz jgit-9ae7d493c45c0cd7243209e004901308816abaf3.zip |
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
-rw-r--r-- | org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsInserter.java | 4 | ||||
-rw-r--r-- | org.eclipse.jgit/src/org/eclipse/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 c57c41741f..a5e920a75e 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.Inflater; 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 class DfsInserter extends ObjectInserter { 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 cc2f350034..2f61dea0d5 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 final class DfsReader extends ObjectReader implements ObjectReuseAsIs { 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 final class DfsReader extends ObjectReader implements ObjectReuseAsIs { 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) { |