Make ZipHeaderInputStream read sub 5 byte entries correctly
Closes gh-13525
This commit is contained in:
		
							parent
							
								
									99f993bc82
								
							
						
					
					
						commit
						6081db5c34
					
				| 
						 | 
				
			
			@ -357,15 +357,15 @@ public class JarWriter implements LoaderClassesWriter {
 | 
			
		|||
		public int read(byte[] b, int off, int len) throws IOException {
 | 
			
		||||
			int read = (this.headerStream != null ? this.headerStream.read(b, off, len)
 | 
			
		||||
					: -1);
 | 
			
		||||
			if (read > 0) {
 | 
			
		||||
			if (read <= 0) {
 | 
			
		||||
				return readRemainder(b, off, len);
 | 
			
		||||
			}
 | 
			
		||||
			this.position += read;
 | 
			
		||||
			}
 | 
			
		||||
			else {
 | 
			
		||||
				read = 0;
 | 
			
		||||
			}
 | 
			
		||||
			if (read < len) {
 | 
			
		||||
				read += super.read(b, off + read, len - read);
 | 
			
		||||
				this.position += read;
 | 
			
		||||
				int remainderRead = readRemainder(b, off + read, len - read);
 | 
			
		||||
				if (remainderRead > 0) {
 | 
			
		||||
					read += remainderRead;
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			if (this.position >= this.headerLength) {
 | 
			
		||||
				this.headerStream = null;
 | 
			
		||||
| 
						 | 
				
			
			@ -377,6 +377,14 @@ public class JarWriter implements LoaderClassesWriter {
 | 
			
		|||
			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 {
 | 
			
		|||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	@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();
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue