Commit 6081db5c authored by Andy Wilkinson's avatar Andy Wilkinson

Make ZipHeaderInputStream read sub 5 byte entries correctly

Closes gh-13525
parent 99f993bc
...@@ -357,15 +357,15 @@ public class JarWriter implements LoaderClassesWriter { ...@@ -357,15 +357,15 @@ public class JarWriter implements LoaderClassesWriter {
public int read(byte[] b, int off, int len) throws IOException { public int read(byte[] b, int off, int len) throws IOException {
int read = (this.headerStream != null ? this.headerStream.read(b, off, len) int read = (this.headerStream != null ? this.headerStream.read(b, off, len)
: -1); : -1);
if (read > 0) { if (read <= 0) {
this.position += read; return readRemainder(b, off, len);
}
else {
read = 0;
} }
if (read < len) {
read += super.read(b, off + read, len - read);
this.position += read; this.position += read;
if (read < len) {
int remainderRead = readRemainder(b, off + read, len - read);
if (remainderRead > 0) {
read += remainderRead;
}
} }
if (this.position >= this.headerLength) { if (this.position >= this.headerLength) {
this.headerStream = null; this.headerStream = null;
...@@ -377,6 +377,14 @@ public class JarWriter implements LoaderClassesWriter { ...@@ -377,6 +377,14 @@ public class JarWriter implements LoaderClassesWriter {
return Arrays.equals(this.header, ZIP_HEADER); return Arrays.equals(this.header, ZIP_HEADER);
} }
private int readRemainder(byte[] b, int off, int len) throws IOException {
int read = super.read(b, off, len);
if (read > 0) {
this.position += read;
}
return read;
}
} }
/** /**
......
...@@ -142,4 +142,56 @@ public class ZipHeaderPeekInputStreamTests { ...@@ -142,4 +142,56 @@ public class ZipHeaderPeekInputStreamTests {
} }
} }
@Test
public void readMoreThanEntireStreamWhenStreamLengthIsLessThanZipHeaderLength()
throws IOException {
ZipHeaderPeekInputStream in = null;
try {
in = new ZipHeaderPeekInputStream(
new ByteArrayInputStream(new byte[] { 10 }));
byte[] bytes = new byte[8];
assertThat(in.read(bytes)).isEqualTo(1);
assertThat(bytes).containsExactly(10, 0, 0, 0, 0, 0, 0, 0);
}
finally {
if (in != null) {
in.close();
}
}
}
@Test
public void readMoreThanEntireStreamWhenStreamLengthIsSameAsHeaderLength()
throws IOException {
ZipHeaderPeekInputStream in = null;
try {
in = new ZipHeaderPeekInputStream(
new ByteArrayInputStream(new byte[] { 1, 2, 3, 4 }));
byte[] bytes = new byte[8];
assertThat(in.read(bytes)).isEqualTo(4);
assertThat(bytes).containsExactly(1, 2, 3, 4, 0, 0, 0, 0);
}
finally {
if (in != null) {
in.close();
}
}
}
@Test
public void readMoreThanEntireStreamWhenStreamLengthIsZero() throws IOException {
ZipHeaderPeekInputStream in = null;
try {
in = new ZipHeaderPeekInputStream(new ByteArrayInputStream(new byte[0]));
byte[] bytes = new byte[8];
assertThat(in.read(bytes)).isEqualTo(-1);
assertThat(bytes).containsExactly(0, 0, 0, 0, 0, 0, 0, 0);
}
finally {
if (in != null) {
in.close();
}
}
}
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment