mirror of
https://github.com/openjdk/jdk.git
synced 2025-08-27 23:04:50 +02:00
8296024: Usage of DirectBuffer::address should be guarded
Reviewed-by: mcimadamore, alanb, psandoz, bpb
This commit is contained in:
parent
a9e6c62ba7
commit
84b927a05b
24 changed files with 635 additions and 430 deletions
|
@ -26,7 +26,6 @@
|
|||
package java.util.zip;
|
||||
|
||||
import java.lang.ref.Cleaner.Cleanable;
|
||||
import java.lang.ref.Reference;
|
||||
import java.nio.ByteBuffer;
|
||||
import java.nio.ReadOnlyBufferException;
|
||||
import java.util.Objects;
|
||||
|
@ -35,6 +34,8 @@ import jdk.internal.ref.CleanerFactory;
|
|||
import jdk.internal.util.Preconditions;
|
||||
import sun.nio.ch.DirectBuffer;
|
||||
|
||||
import static java.util.zip.ZipUtils.NIO_ACCESS;
|
||||
|
||||
/**
|
||||
* This class provides support for general purpose decompression using the
|
||||
* popular ZLIB compression library. The ZLIB compression library was
|
||||
|
@ -259,11 +260,12 @@ public class Inflater {
|
|||
int remaining = Math.max(dictionary.limit() - position, 0);
|
||||
ensureOpen();
|
||||
if (dictionary.isDirect()) {
|
||||
long address = ((DirectBuffer) dictionary).address();
|
||||
NIO_ACCESS.acquireSession(dictionary);
|
||||
try {
|
||||
long address = ((DirectBuffer) dictionary).address();
|
||||
setDictionaryBuffer(zsRef.address(), address + position, remaining);
|
||||
} finally {
|
||||
Reference.reachabilityFence(dictionary);
|
||||
NIO_ACCESS.releaseSession(dictionary);
|
||||
}
|
||||
} else {
|
||||
byte[] array = ZipUtils.getBufferArray(dictionary);
|
||||
|
@ -383,13 +385,14 @@ public class Inflater {
|
|||
try {
|
||||
int inputRem = Math.max(input.limit() - inputPos, 0);
|
||||
if (input.isDirect()) {
|
||||
NIO_ACCESS.acquireSession(input);
|
||||
try {
|
||||
long inputAddress = ((DirectBuffer) input).address();
|
||||
result = inflateBufferBytes(zsRef.address(),
|
||||
inputAddress + inputPos, inputRem,
|
||||
output, off, len);
|
||||
} finally {
|
||||
Reference.reachabilityFence(input);
|
||||
NIO_ACCESS.releaseSession(input);
|
||||
}
|
||||
} else {
|
||||
byte[] inputArray = ZipUtils.getBufferArray(input);
|
||||
|
@ -517,13 +520,14 @@ public class Inflater {
|
|||
inputPos = this.inputPos;
|
||||
try {
|
||||
if (output.isDirect()) {
|
||||
long outputAddress = ((DirectBuffer) output).address();
|
||||
NIO_ACCESS.acquireSession(output);
|
||||
try {
|
||||
long outputAddress = ((DirectBuffer) output).address();
|
||||
result = inflateBytesBuffer(zsRef.address(),
|
||||
inputArray, inputPos, inputLim - inputPos,
|
||||
outputAddress + outputPos, outputRem);
|
||||
} finally {
|
||||
Reference.reachabilityFence(output);
|
||||
NIO_ACCESS.releaseSession(output);
|
||||
}
|
||||
} else {
|
||||
byte[] outputArray = ZipUtils.getBufferArray(output);
|
||||
|
@ -541,16 +545,18 @@ public class Inflater {
|
|||
int inputRem = Math.max(input.limit() - inputPos, 0);
|
||||
try {
|
||||
if (input.isDirect()) {
|
||||
long inputAddress = ((DirectBuffer) input).address();
|
||||
NIO_ACCESS.acquireSession(input);
|
||||
try {
|
||||
long inputAddress = ((DirectBuffer) input).address();
|
||||
if (output.isDirect()) {
|
||||
long outputAddress = ((DirectBuffer) output).address();
|
||||
NIO_ACCESS.acquireSession(output);
|
||||
try {
|
||||
long outputAddress = ((DirectBuffer) output).address();
|
||||
result = inflateBufferBuffer(zsRef.address(),
|
||||
inputAddress + inputPos, inputRem,
|
||||
outputAddress + outputPos, outputRem);
|
||||
} finally {
|
||||
Reference.reachabilityFence(output);
|
||||
NIO_ACCESS.releaseSession(output);
|
||||
}
|
||||
} else {
|
||||
byte[] outputArray = ZipUtils.getBufferArray(output);
|
||||
|
@ -560,19 +566,20 @@ public class Inflater {
|
|||
outputArray, outputOffset + outputPos, outputRem);
|
||||
}
|
||||
} finally {
|
||||
Reference.reachabilityFence(input);
|
||||
NIO_ACCESS.releaseSession(input);
|
||||
}
|
||||
} else {
|
||||
byte[] inputArray = ZipUtils.getBufferArray(input);
|
||||
int inputOffset = ZipUtils.getBufferOffset(input);
|
||||
if (output.isDirect()) {
|
||||
long outputAddress = ((DirectBuffer) output).address();
|
||||
NIO_ACCESS.acquireSession(output);
|
||||
try {
|
||||
long outputAddress = ((DirectBuffer) output).address();
|
||||
result = inflateBytesBuffer(zsRef.address(),
|
||||
inputArray, inputOffset + inputPos, inputRem,
|
||||
outputAddress + outputPos, outputRem);
|
||||
} finally {
|
||||
Reference.reachabilityFence(output);
|
||||
NIO_ACCESS.releaseSession(output);
|
||||
}
|
||||
} else {
|
||||
byte[] outputArray = ZipUtils.getBufferArray(output);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue