summaryrefslogtreecommitdiffstats
path: root/org.eclipse.jgit
diff options
context:
space:
mode:
authorThomas Wolf <twolf@apache.org>2022-10-31 22:44:50 +0100
committerMatthias Sohn <matthias.sohn@sap.com>2022-11-16 15:17:19 -0500
commit1c886d92f6de1d577cbcc212e1e25b2c3207d5fb (patch)
treec9c72fffd55e430c8c805fdfe4da627291e9c1f5 /org.eclipse.jgit
parent0fb9d26eff27f3843a389e3b41e8331fee412a6c (diff)
downloadjgit-1c886d92f6de1d577cbcc212e1e25b2c3207d5fb.tar.gz
jgit-1c886d92f6de1d577cbcc212e1e25b2c3207d5fb.zip
RawText.isBinary(): handle complete buffer correctly
Make sure we always get consistent results, whether or not we have the full data in the buffer. Change-Id: Ieb379a0c375ad3dd352e63ac2f23bda6ef16c215 Signed-off-by: Thomas Wolf <twolf@apache.org>
Diffstat (limited to 'org.eclipse.jgit')
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/diff/RawText.java15
1 files changed, 12 insertions, 3 deletions
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/diff/RawText.java b/org.eclipse.jgit/src/org/eclipse/jgit/diff/RawText.java
index 19961a13eb..b52803513d 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/diff/RawText.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/diff/RawText.java
@@ -288,12 +288,13 @@ public class RawText extends Sequence {
* if input stream could not be read
*/
public static boolean isBinary(InputStream raw) throws IOException {
- final byte[] buffer = new byte[getBufferSize()];
+ final byte[] buffer = new byte[getBufferSize() + 1];
int cnt = 0;
while (cnt < buffer.length) {
final int n = raw.read(buffer, cnt, buffer.length - cnt);
- if (n == -1)
+ if (n == -1) {
break;
+ }
cnt += n;
}
return isBinary(buffer, cnt, cnt < buffer.length);
@@ -347,8 +348,16 @@ public class RawText extends Sequence {
// - limited buffer size; may be only the beginning of a large blob
// - no counting of printable vs. non-printable bytes < 0x20 and 0x7F
int maxLength = getBufferSize();
+ boolean isComplete = complete;
if (length > maxLength) {
+ // We restrict the length in all cases to getBufferSize() to get
+ // predictable behavior. Sometimes we load streams, and sometimes we
+ // have the full data in memory. With streams, we never look at more
+ // than the first getBufferSize() bytes. If we looked at more when
+ // we have the full data, different code paths in JGit might come to
+ // different conclusions.
length = maxLength;
+ isComplete = false;
}
byte last = 'x'; // Just something inconspicuous.
for (int ptr = 0; ptr < length; ptr++) {
@@ -358,7 +367,7 @@ public class RawText extends Sequence {
}
last = curr;
}
- if (complete) {
+ if (isComplete) {
// Buffer contains everything...
return last == '\r'; // ... so this must be a lone CR
}