Browse Source

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
stable-4.5
Shawn Pearce 8 years ago
parent
commit
9ae7d493c4
  1. 4
      org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsInserter.java
  2. 17
      org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsReader.java

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

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

Loading…
Cancel
Save