This method ignores the return value of java.io.InputStream.skip() which can skip multiple bytes. If the return value is not checked, the caller will not be able to correctly handle the case where fewer bytes were skipped than the caller requested. This is a particularly insidious kind of bug, because in many programs, skips from input streams usually do skip the full amount of data requested, causing the program to fail only sporadically. With Buffered streams, however, skip() will only skip data in the buffer, and will routinely fail to skip the requested number of bytes. Signed-off-by: Matthias Sohn <matthias.sohn@xxxxxxx> --- .../jgit/transport/BundleFetchConnection.java | 16 ++++++++++++++-- 1 files changed, 14 insertions(+), 2 deletions(-) diff --git a/org.spearce.jgit/src/org/spearce/jgit/transport/BundleFetchConnection. java b/org.spearce.jgit/src/org/spearce/jgit/transport/BundleFetchConnection. java index 40bf7db..642c984 100644 --- a/org.spearce.jgit/src/org/spearce/jgit/transport/BundleFetchConnection. java +++ b/org.spearce.jgit/src/org/spearce/jgit/transport/BundleFetchConnection. java @@ -39,6 +39,7 @@ package org.spearce.jgit.transport; import java.io.BufferedInputStream; +import java.io.EOFException; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; @@ -139,12 +140,23 @@ private String readLine(final byte[] hdrbuf) throws IOException { while (lf < cnt && hdrbuf[lf] != '\n') lf++; bin.reset(); - bin.skip(lf); + skipFully(bin, lf); if (lf < cnt && hdrbuf[lf] == '\n') - bin.skip(1); + skipFully(bin, 1); return RawParseUtils.decode(Constants.CHARSET, hdrbuf, 0, lf); } + // skip given number of bytes on InputStream respecting return value of InputStream.skip() + static private void skipFully(InputStream in, long nBytes) throws IOException { + long remaining = nBytes; + while (remaining != 0) { + long skipped = in.skip(remaining); + if (skipped == 0) // EOF + throw new EOFException(); + remaining -= skipped; + } + } + public boolean didFetchTestConnectivity() { return false; } -- 1.6.2.2.1669.g7eaf8 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html