Browse Source

Fix handling of corruption for truncated objects

If a loose object was corrupted by truncation, JGit would hang.

Change-Id: I7e4c14f44183a5fcb37c1562e81682bddeba80ad
Signed-off-by: Robin Rosenberg <robin.rosenberg@dewire.com>
stable-0.8
Robin Rosenberg 15 years ago
parent
commit
c10e134157
  1. 19
      org.eclipse.jgit/src/org/eclipse/jgit/lib/UnpackedObjectLoader.java

19
org.eclipse.jgit/src/org/eclipse/jgit/lib/UnpackedObjectLoader.java

@ -114,8 +114,13 @@ public class UnpackedObjectLoader extends ObjectLoader {
int avail = 0; int avail = 0;
while (!inflater.finished() && avail < hdr.length) while (!inflater.finished() && avail < hdr.length)
try { try {
avail += inflater.inflate(hdr, avail, hdr.length int uncompressed = inflater.inflate(hdr, avail,
- avail); hdr.length - avail);
if (uncompressed == 0) {
throw new CorruptObjectException(id,
"bad stream, corrupt header");
}
avail += uncompressed;
} catch (DataFormatException dfe) { } catch (DataFormatException dfe) {
final CorruptObjectException coe; final CorruptObjectException coe;
coe = new CorruptObjectException(id, "bad stream"); coe = new CorruptObjectException(id, "bad stream");
@ -172,8 +177,14 @@ public class UnpackedObjectLoader extends ObjectLoader {
private void decompress(final AnyObjectId id, final Inflater inf, int p) private void decompress(final AnyObjectId id, final Inflater inf, int p)
throws CorruptObjectException { throws CorruptObjectException {
try { try {
while (!inf.finished()) while (!inf.finished()) {
p += inf.inflate(bytes, p, objectSize - p); int uncompressed = inf.inflate(bytes, p, objectSize - p);
p += uncompressed;
if (uncompressed == 0 && !inf.finished()) {
throw new CorruptObjectException(id,
"bad stream, corrupt header");
}
}
} catch (DataFormatException dfe) { } catch (DataFormatException dfe) {
final CorruptObjectException coe; final CorruptObjectException coe;
coe = new CorruptObjectException(id, "bad stream"); coe = new CorruptObjectException(id, "bad stream");

Loading…
Cancel
Save