From aad279208e70f28dd9b8b1e1eb314c6272b5986e Mon Sep 17 00:00:00 2001 From: Madhura Bhave Date: Tue, 1 May 2018 16:35:43 -0700 Subject: [PATCH] Throw exception if RandomAccessData tries to read beyond EOF Fixes gh-12986 --- .../boot/loader/data/RandomAccessData.java | 3 ++ .../loader/data/RandomAccessDataFile.java | 7 ++++ .../data/RandomAccessDataFileTests.java | 33 +++++++++++++++++++ 3 files changed, 43 insertions(+) diff --git a/spring-boot-project/spring-boot-tools/spring-boot-loader/src/main/java/org/springframework/boot/loader/data/RandomAccessData.java b/spring-boot-project/spring-boot-tools/spring-boot-loader/src/main/java/org/springframework/boot/loader/data/RandomAccessData.java index 5db8a23b90a..e4945713f96 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-loader/src/main/java/org/springframework/boot/loader/data/RandomAccessData.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-loader/src/main/java/org/springframework/boot/loader/data/RandomAccessData.java @@ -16,6 +16,7 @@ package org.springframework.boot.loader.data; +import java.io.EOFException; import java.io.IOException; import java.io.InputStream; @@ -56,6 +57,8 @@ public interface RandomAccessData { * @param length the number of bytes to be read * @return the data * @throws IOException if the data cannot be read + * @throws IndexOutOfBoundsException if offset is beyond the end of the file or subsection + * @throws EOFException if offset plus length is greater than the length of the file or subsection */ byte[] read(long offset, long length) throws IOException; diff --git a/spring-boot-project/spring-boot-tools/spring-boot-loader/src/main/java/org/springframework/boot/loader/data/RandomAccessDataFile.java b/spring-boot-project/spring-boot-tools/spring-boot-loader/src/main/java/org/springframework/boot/loader/data/RandomAccessDataFile.java index c5933ff0748..1adc4f6afe6 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-loader/src/main/java/org/springframework/boot/loader/data/RandomAccessDataFile.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-loader/src/main/java/org/springframework/boot/loader/data/RandomAccessDataFile.java @@ -16,6 +16,7 @@ package org.springframework.boot.loader.data; +import java.io.EOFException; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; @@ -90,6 +91,12 @@ public class RandomAccessDataFile implements RandomAccessData { @Override public byte[] read(long offset, long length) throws IOException { + if (offset > this.length) { + throw new IndexOutOfBoundsException(); + } + if (offset + length > this.length) { + throw new EOFException(); + } byte[] bytes = new byte[(int) length]; read(bytes, offset, 0, bytes.length); return bytes; diff --git a/spring-boot-project/spring-boot-tools/spring-boot-loader/src/test/java/org/springframework/boot/loader/data/RandomAccessDataFileTests.java b/spring-boot-project/spring-boot-tools/spring-boot-loader/src/test/java/org/springframework/boot/loader/data/RandomAccessDataFileTests.java index 972bfa066b2..c9e899f937c 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-loader/src/test/java/org/springframework/boot/loader/data/RandomAccessDataFileTests.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-loader/src/test/java/org/springframework/boot/loader/data/RandomAccessDataFileTests.java @@ -16,6 +16,7 @@ package org.springframework.boot.loader.data; +import java.io.EOFException; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; @@ -96,6 +97,38 @@ public class RandomAccessDataFileTests { new RandomAccessDataFile(file); } + @Test + public void readWithOffsetAndLengthShouldRead() throws Exception { + byte[] read = this.file.read(2, 3); + assertThat(read).isEqualTo(new byte[] { 2, 3, 4 }); + } + + @Test + public void readWhenOffsetIsBeyondEOFShouldThrowException() throws Exception { + this.thrown.expect(IndexOutOfBoundsException.class); + this.file.read(257, 0); + } + + @Test + public void readWhenOffsetIsBeyondEndOfSubsectionShouldThrowException() throws Exception { + this.thrown.expect(IndexOutOfBoundsException.class); + RandomAccessData subsection = this.file.getSubsection(0, 10); + subsection.read(11, 0); + } + + @Test + public void readWhenOffsetPlusLengthGreaterThanEOFShouldThrowException() throws Exception { + this.thrown.expect(EOFException.class); + this.file.read(256, 1); + } + + @Test + public void readWhenOffsetPlusLengthGreaterThanEndOfSubsectionShouldThrowException() throws Exception { + this.thrown.expect(EOFException.class); + RandomAccessData subsection = this.file.getSubsection(0, 10); + subsection.read(10, 1); + } + @Test public void inputStreamRead() throws Exception { for (int i = 0; i <= 255; i++) {