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
This commit is contained in:
Shawn Pearce 2016-08-25 18:59:15 -07:00
parent 1836a7b273
commit 9ae7d493c4
2 changed files with 17 additions and 4 deletions

View File

@ -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;

View File

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