summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorShawn Pearce <spearce@spearce.org>2016-08-25 18:59:15 -0700
committerShawn Pearce <spearce@spearce.org>2016-08-25 19:17:09 -0700
commit9ae7d493c45c0cd7243209e004901308816abaf3 (patch)
tree80dac67fb56778421ba977f9c7db9f5e2b4d816a
parent1836a7b273b63d6e217e5b58322cb1a079517101 (diff)
downloadjgit-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.java4
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsReader.java17
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) {