From c10e13415705d63e4d5d2487ca6fff1fe1ff10bb Mon Sep 17 00:00:00 2001
From: Robin Rosenberg <robin.rosenberg@dewire.com>
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 <robin.rosenberg@dewire.com>
---
 .../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");
-- 
GitLab