diff --git a/jdk/src/java.base/share/classes/jdk/internal/jimage/BasicImageReader.java b/jdk/src/java.base/share/classes/jdk/internal/jimage/BasicImageReader.java index 68b076784f5..07038b9ef5e 100644 --- a/jdk/src/java.base/share/classes/jdk/internal/jimage/BasicImageReader.java +++ b/jdk/src/java.base/share/classes/jdk/internal/jimage/BasicImageReader.java @@ -67,9 +67,9 @@ public class BasicImageReader implements AutoCloseable { static private final boolean MAP_ALL = isSystemProperty("jdk.image.map.all", "true", IS_64_BIT ? "true" : "false"); - private final String name; - private final ByteOrder byteOrder; private final Path imagePath; + private final ByteOrder byteOrder; + private final String name; private final ByteBuffer memoryMap; private final FileChannel channel; private final ImageHeader header; @@ -83,11 +83,9 @@ public class BasicImageReader implements AutoCloseable { protected BasicImageReader(Path path, ByteOrder byteOrder) throws IOException { - Objects.requireNonNull(path); - Objects.requireNonNull(byteOrder); - this.name = path.toString(); - this.byteOrder = byteOrder; - imagePath = path; + this.imagePath = Objects.requireNonNull(path); + this.byteOrder = Objects.requireNonNull(byteOrder); + this.name = this.imagePath.toString(); ByteBuffer map; @@ -211,6 +209,8 @@ public class BasicImageReader implements AutoCloseable { } public static void releaseByteBuffer(ByteBuffer buffer) { + Objects.requireNonNull(buffer); + if (!MAP_ALL) { ImageBufferCache.releaseBuffer(buffer); } @@ -240,10 +240,14 @@ public class BasicImageReader implements AutoCloseable { } public ImageLocation findLocation(String mn, String rn) { + Objects.requireNonNull(mn); + Objects.requireNonNull(rn); + return findLocation("/" + mn + "/" + rn); } public synchronized ImageLocation findLocation(String name) { + Objects.requireNonNull(name); // Details of the algorithm used here can be found in // jdk.tools.jlink.internal.PerfectHashBuilder. byte[] bytes = ImageStringsReader.mutf8FromString(name); @@ -287,16 +291,25 @@ public class BasicImageReader implements AutoCloseable { } public long[] getAttributes(int offset) { + if (offset < 0 || offset >= locations.limit()) { + throw new IndexOutOfBoundsException("offset"); + } + ByteBuffer buffer = slice(locations, offset, locations.limit() - offset); return ImageLocation.decompress(buffer); } public String getString(int offset) { + if (offset < 0 || offset >= strings.limit()) { + throw new IndexOutOfBoundsException("offset"); + } + ByteBuffer buffer = slice(strings, offset, strings.limit() - offset); return ImageStringsReader.stringFromByteBuffer(buffer); } private byte[] getBufferBytes(ByteBuffer buffer) { + Objects.requireNonNull(buffer); byte[] bytes = new byte[buffer.limit()]; buffer.get(bytes); @@ -343,6 +356,7 @@ public class BasicImageReader implements AutoCloseable { } public byte[] getResource(String name) { + Objects.requireNonNull(name); ImageLocation location = findLocation(name); return location != null ? getResource(location) : null; @@ -362,6 +376,7 @@ public class BasicImageReader implements AutoCloseable { } public ByteBuffer getResourceBuffer(ImageLocation loc) { + Objects.requireNonNull(loc); long offset = loc.getContentOffset() + indexSize; long compressedSize = loc.getCompressedSize(); long uncompressedSize = loc.getUncompressedSize(); @@ -399,6 +414,7 @@ public class BasicImageReader implements AutoCloseable { } public InputStream getResourceStream(ImageLocation loc) { + Objects.requireNonNull(loc); byte[] bytes = getResource(loc); return new ByteArrayInputStream(bytes); diff --git a/jdk/src/java.base/share/classes/jdk/internal/jimage/ImageHeader.java b/jdk/src/java.base/share/classes/jdk/internal/jimage/ImageHeader.java index 094f8dd6929..a7ab8a45286 100644 --- a/jdk/src/java.base/share/classes/jdk/internal/jimage/ImageHeader.java +++ b/jdk/src/java.base/share/classes/jdk/internal/jimage/ImageHeader.java @@ -27,6 +27,7 @@ package jdk.internal.jimage; import java.nio.ByteBuffer; import java.nio.IntBuffer; +import java.util.Objects; /** * @implNote This class needs to maintain JDK 8 source compatibility. @@ -75,6 +76,8 @@ public final class ImageHeader { } static ImageHeader readFrom(IntBuffer buffer) { + Objects.requireNonNull(buffer); + if (buffer.capacity() != HEADER_SLOTS) { throw new InternalError("jimage header not the correct size"); } @@ -94,11 +97,13 @@ public final class ImageHeader { } public void writeTo(ImageStream stream) { + Objects.requireNonNull(stream); stream.ensure(getHeaderSize()); writeTo(stream.getBuffer()); } public void writeTo(ByteBuffer buffer) { + Objects.requireNonNull(buffer); buffer.putInt(magic); buffer.putInt(majorVersion << 16 | minorVersion); buffer.putInt(flags); diff --git a/jdk/src/java.base/share/classes/jdk/internal/jimage/ImageLocation.java b/jdk/src/java.base/share/classes/jdk/internal/jimage/ImageLocation.java index a8147d2a53a..16787dad3af 100644 --- a/jdk/src/java.base/share/classes/jdk/internal/jimage/ImageLocation.java +++ b/jdk/src/java.base/share/classes/jdk/internal/jimage/ImageLocation.java @@ -26,6 +26,7 @@ package jdk.internal.jimage; import java.nio.ByteBuffer; +import java.util.Objects; /** * @implNote This class needs to maintain JDK 8 source compatibility. @@ -50,8 +51,8 @@ public class ImageLocation { protected final ImageStrings strings; public ImageLocation(long[] attributes, ImageStrings strings) { - this.attributes = attributes; - this.strings = strings; + this.attributes = Objects.requireNonNull(attributes); + this.strings = Objects.requireNonNull(strings); } ImageStrings getStrings() { @@ -67,6 +68,7 @@ public class ImageLocation { } static long[] decompress(ByteBuffer bytes) { + Objects.requireNonNull(bytes); long[] attributes = new long[ATTRIBUTE_COUNT]; if (bytes != null) { @@ -103,6 +105,7 @@ public class ImageLocation { } public static byte[] compress(long[] attributes) { + Objects.requireNonNull(attributes); ImageStream stream = new ImageStream(16); for (int kind = ATTRIBUTE_END + 1; kind < ATTRIBUTE_COUNT; kind++) { @@ -124,6 +127,8 @@ public class ImageLocation { } public boolean verify(String name) { + Objects.requireNonNull(name); + return name.equals(getFullName()); } @@ -250,6 +255,7 @@ public class ImageLocation { } static ImageLocation readFrom(BasicImageReader reader, int offset) { + Objects.requireNonNull(reader); long[] attributes = reader.getAttributes(offset); ImageStringsReader strings = reader.getStrings(); diff --git a/jdk/src/java.base/share/classes/jdk/internal/jimage/ImageReader.java b/jdk/src/java.base/share/classes/jdk/internal/jimage/ImageReader.java index a747ea8aa7b..60ab472db3e 100644 --- a/jdk/src/java.base/share/classes/jdk/internal/jimage/ImageReader.java +++ b/jdk/src/java.base/share/classes/jdk/internal/jimage/ImageReader.java @@ -59,6 +59,9 @@ public final class ImageReader implements AutoCloseable { } public static ImageReader open(Path imagePath, ByteOrder byteOrder) throws IOException { + Objects.requireNonNull(imagePath); + Objects.requireNonNull(byteOrder); + return SharedImageReader.open(imagePath, byteOrder); } @@ -218,6 +221,9 @@ public final class ImageReader implements AutoCloseable { } public static ImageReader open(Path imagePath, ByteOrder byteOrder) throws IOException { + Objects.requireNonNull(imagePath); + Objects.requireNonNull(byteOrder); + synchronized (OPEN_FILES) { SharedImageReader reader = OPEN_FILES.get(imagePath); @@ -237,6 +243,8 @@ public final class ImageReader implements AutoCloseable { } public void close(ImageReader image) throws IOException { + Objects.requireNonNull(image); + synchronized (OPEN_FILES) { if (!openers.remove(image)) { throw new IOException("image file already closed"); diff --git a/jdk/src/java.base/share/classes/jdk/internal/jimage/ImageReaderFactory.java b/jdk/src/java.base/share/classes/jdk/internal/jimage/ImageReaderFactory.java index 23be8faaf19..092b309b0b7 100644 --- a/jdk/src/java.base/share/classes/jdk/internal/jimage/ImageReaderFactory.java +++ b/jdk/src/java.base/share/classes/jdk/internal/jimage/ImageReaderFactory.java @@ -31,6 +31,7 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.util.concurrent.ConcurrentHashMap; import java.util.Map; +import java.util.Objects; /** * Factory to get ImageReader @@ -54,6 +55,7 @@ public class ImageReaderFactory { * Returns an {@code ImageReader} to read from the given image file */ public static ImageReader get(Path jimage) throws IOException { + Objects.requireNonNull(jimage); ImageReader reader = readers.get(jimage); if (reader != null) { return reader; diff --git a/jdk/src/java.base/share/classes/jdk/internal/jimage/ImageStream.java b/jdk/src/java.base/share/classes/jdk/internal/jimage/ImageStream.java index 6abe1e651aa..dfa6394acdf 100644 --- a/jdk/src/java.base/share/classes/jdk/internal/jimage/ImageStream.java +++ b/jdk/src/java.base/share/classes/jdk/internal/jimage/ImageStream.java @@ -28,6 +28,7 @@ package jdk.internal.jimage; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.util.Arrays; +import java.util.Objects; /** * @implNote This class needs to maintain JDK 8 source compatibility. @@ -57,16 +58,16 @@ public class ImageStream { public ImageStream(int size, ByteOrder byteOrder) { buffer = ByteBuffer.allocate(size); - buffer.order(byteOrder); + buffer.order(Objects.requireNonNull(byteOrder)); } public ImageStream(byte[] bytes, ByteOrder byteOrder) { - buffer = ByteBuffer.wrap(bytes); - buffer.order(byteOrder); + buffer = ByteBuffer.wrap(Objects.requireNonNull(bytes)); + buffer.order(Objects.requireNonNull(byteOrder)); } public ImageStream(ByteBuffer buffer) { - this.buffer = buffer; + this.buffer = Objects.requireNonNull(buffer); } public ImageStream align(int alignment) { diff --git a/jdk/src/java.base/share/classes/jdk/internal/jimage/ImageStringsReader.java b/jdk/src/java.base/share/classes/jdk/internal/jimage/ImageStringsReader.java index 7a6ad7b75f4..acddf421d9d 100644 --- a/jdk/src/java.base/share/classes/jdk/internal/jimage/ImageStringsReader.java +++ b/jdk/src/java.base/share/classes/jdk/internal/jimage/ImageStringsReader.java @@ -27,6 +27,7 @@ package jdk.internal.jimage; import java.io.UTFDataFormatException; import java.nio.ByteBuffer; +import java.util.Objects; /** * @implNote This class needs to maintain JDK 8 source compatibility. @@ -40,7 +41,7 @@ public class ImageStringsReader implements ImageStrings { private final BasicImageReader reader; ImageStringsReader(BasicImageReader reader) { - this.reader = reader; + this.reader = Objects.requireNonNull(reader); } @Override @@ -54,7 +55,19 @@ public class ImageStringsReader implements ImageStrings { } private static int hashCode(byte[] bytes, int offset, int count, int seed) { - for (int i = offset, limit = offset + count; i < limit; i++) { + Objects.requireNonNull(bytes); + + if (offset < 0 || offset >= bytes.length) { + throw new IndexOutOfBoundsException("offset"); + } + + int limit = offset + count; + + if (limit < 0 || limit > bytes.length) { + throw new IndexOutOfBoundsException("limit"); + } + + for (int i = offset; i < limit; i++) { seed = (seed * HASH_MULTIPLIER) ^ (bytes[i] & 0xFF); }