aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorwh <wh9692@protonmail.com>2020-12-17 18:14:32 +0000
committerMatthias Sohn <matthias.sohn@sap.com>2021-02-19 17:34:04 -0500
commita14455dfd7ac61e13f2ea8c7d789463efd8eeb72 (patch)
treec4a01dae625b733c4add4831f543785e6240406f
parent27fbd8bf5691ffd300f1da505da5e52faa378771 (diff)
downloadjgit-a14455dfd7ac61e13f2ea8c7d789463efd8eeb72.tar.gz
jgit-a14455dfd7ac61e13f2ea8c7d789463efd8eeb72.zip
dfs: handle short copies
`copy` is documented as possibly returning a smaller number of bytes than requested. In practice, this can occur if a block is cached and the reader never pulls in the file to check its size. Bug: 565874 Change-Id: I1e53b3d2f4ab09334178934dc0ef74ea99045cd3 Signed-off-by: wh <wh9692@protonmail.com> Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsPackFile.java11
1 files changed, 9 insertions, 2 deletions
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsPackFile.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsPackFile.java
index b1e95520cc..96ca690c1c 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsPackFile.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsPackFile.java
@@ -607,8 +607,15 @@ public final class DfsPackFile extends BlockBasedFile {
private void readFully(long position, byte[] dstbuf, int dstoff, int cnt,
DfsReader ctx) throws IOException {
- if (ctx.copy(this, position, dstbuf, dstoff, cnt) != cnt)
- throw new EOFException();
+ while (cnt > 0) {
+ int copied = ctx.copy(this, position, dstbuf, dstoff, cnt);
+ if (copied == 0) {
+ throw new EOFException();
+ }
+ position += copied;
+ dstoff += copied;
+ cnt -= copied;
+ }
}
ObjectLoader load(DfsReader ctx, long pos)