diff options
author | wh <wh9692@protonmail.com> | 2020-12-17 18:14:32 +0000 |
---|---|---|
committer | Matthias Sohn <matthias.sohn@sap.com> | 2021-02-19 17:34:04 -0500 |
commit | a14455dfd7ac61e13f2ea8c7d789463efd8eeb72 (patch) | |
tree | c4a01dae625b733c4add4831f543785e6240406f | |
parent | 27fbd8bf5691ffd300f1da505da5e52faa378771 (diff) | |
download | jgit-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.java | 11 |
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) |