From c10e13415705d63e4d5d2487ca6fff1fe1ff10bb Mon Sep 17 00:00:00 2001 From: Robin Rosenberg Date: Sat, 1 May 2010 09:23:03 +0200 Subject: [PATCH] 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 --- .../jgit/lib/UnpackedObjectLoader.java | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/UnpackedObjectLoader.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/UnpackedObjectLoader.java index 005df4b98..96a1f8024 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/UnpackedObjectLoader.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/UnpackedObjectLoader.java @@ -114,8 +114,13 @@ private UnpackedObjectLoader(final byte[] compressed, final AnyObjectId id) int avail = 0; while (!inflater.finished() && avail < hdr.length) try { - avail += inflater.inflate(hdr, avail, hdr.length - - avail); + int uncompressed = inflater.inflate(hdr, avail, + hdr.length - avail); + if (uncompressed == 0) { + throw new CorruptObjectException(id, + "bad stream, corrupt header"); + } + avail += uncompressed; } catch (DataFormatException dfe) { final CorruptObjectException coe; coe = new CorruptObjectException(id, "bad stream"); @@ -172,8 +177,14 @@ private UnpackedObjectLoader(final byte[] compressed, final AnyObjectId id) private void decompress(final AnyObjectId id, final Inflater inf, int p) throws CorruptObjectException { try { - while (!inf.finished()) - p += inf.inflate(bytes, p, objectSize - p); + while (!inf.finished()) { + 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) { final CorruptObjectException coe; coe = new CorruptObjectException(id, "bad stream");