mirror of
https://github.com/openjdk/jdk.git
synced 2025-08-27 14:54:52 +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
|
@ -37,6 +37,7 @@ import jdk.internal.vm.annotation.ForceInline;
|
|||
|
||||
import java.io.FileDescriptor;
|
||||
import java.lang.foreign.MemorySegment;
|
||||
import java.lang.ref.Reference;
|
||||
import java.util.Objects;
|
||||
import java.util.Spliterator;
|
||||
|
||||
|
@ -779,6 +780,7 @@ public abstract sealed class Buffer
|
|||
// setup access to this package in SharedSecrets
|
||||
SharedSecrets.setJavaNioAccess(
|
||||
new JavaNioAccess() {
|
||||
|
||||
@Override
|
||||
public BufferPool getDirectBufferPool() {
|
||||
return Bits.BUFFER_POOL;
|
||||
|
@ -824,16 +826,34 @@ public abstract sealed class Buffer
|
|||
}
|
||||
|
||||
@Override
|
||||
public Runnable acquireSession(Buffer buffer, boolean async) {
|
||||
var session = buffer.session();
|
||||
if (session == null) {
|
||||
return null;
|
||||
public void acquireSession(Buffer buffer) {
|
||||
var scope = buffer.session();
|
||||
if (scope != null) {
|
||||
scope.acquire0();
|
||||
}
|
||||
if (async && session.ownerThread() != null) {
|
||||
throw new IllegalStateException("Confined session not supported");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void releaseSession(Buffer buffer) {
|
||||
try {
|
||||
var scope = buffer.session();
|
||||
if (scope != null) {
|
||||
scope.release0();
|
||||
}
|
||||
} finally {
|
||||
Reference.reachabilityFence(buffer);
|
||||
}
|
||||
session.acquire0();
|
||||
return session::release0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isThreadConfined(Buffer buffer) {
|
||||
var scope = buffer.session();
|
||||
return scope != null && scope.ownerThread() != null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasSession(Buffer buffer) {
|
||||
return buffer.session() != null;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -25,11 +25,13 @@
|
|||
|
||||
package java.util.zip;
|
||||
|
||||
import java.lang.ref.Reference;
|
||||
import java.nio.ByteBuffer;
|
||||
import sun.nio.ch.DirectBuffer;
|
||||
|
||||
import jdk.internal.util.Preconditions;
|
||||
import jdk.internal.vm.annotation.IntrinsicCandidate;
|
||||
import sun.nio.ch.DirectBuffer;
|
||||
|
||||
import static java.util.zip.ZipUtils.NIO_ACCESS;
|
||||
|
||||
/**
|
||||
* A class that can be used to compute the Adler-32 checksum of a data
|
||||
|
@ -96,10 +98,11 @@ public class Adler32 implements Checksum {
|
|||
if (rem <= 0)
|
||||
return;
|
||||
if (buffer.isDirect()) {
|
||||
NIO_ACCESS.acquireSession(buffer);
|
||||
try {
|
||||
adler = updateByteBuffer(adler, ((DirectBuffer)buffer).address(), pos, rem);
|
||||
} finally {
|
||||
Reference.reachabilityFence(buffer);
|
||||
NIO_ACCESS.releaseSession(buffer);
|
||||
}
|
||||
} else if (buffer.hasArray()) {
|
||||
adler = updateBytes(adler, buffer.array(), pos + buffer.arrayOffset(), rem);
|
||||
|
|
|
@ -25,7 +25,6 @@
|
|||
|
||||
package java.util.zip;
|
||||
|
||||
import java.lang.ref.Reference;
|
||||
import java.nio.ByteBuffer;
|
||||
import java.util.Objects;
|
||||
|
||||
|
@ -33,6 +32,8 @@ import sun.nio.ch.DirectBuffer;
|
|||
import jdk.internal.util.Preconditions;
|
||||
import jdk.internal.vm.annotation.IntrinsicCandidate;
|
||||
|
||||
import static java.util.zip.ZipUtils.NIO_ACCESS;
|
||||
|
||||
/**
|
||||
* A class that can be used to compute the CRC-32 of a data stream.
|
||||
*
|
||||
|
@ -96,10 +97,11 @@ public class CRC32 implements Checksum {
|
|||
if (rem <= 0)
|
||||
return;
|
||||
if (buffer.isDirect()) {
|
||||
NIO_ACCESS.acquireSession(buffer);
|
||||
try {
|
||||
crc = updateByteBuffer(crc, ((DirectBuffer)buffer).address(), pos, rem);
|
||||
} finally {
|
||||
Reference.reachabilityFence(buffer);
|
||||
NIO_ACCESS.releaseSession(buffer);
|
||||
}
|
||||
} else if (buffer.hasArray()) {
|
||||
crc = updateBytes(crc, buffer.array(), pos + buffer.arrayOffset(), rem);
|
||||
|
|
|
@ -24,7 +24,6 @@
|
|||
*/
|
||||
package java.util.zip;
|
||||
|
||||
import java.lang.ref.Reference;
|
||||
import java.nio.ByteBuffer;
|
||||
import java.nio.ByteOrder;
|
||||
|
||||
|
@ -33,6 +32,8 @@ import jdk.internal.util.Preconditions;
|
|||
import jdk.internal.vm.annotation.IntrinsicCandidate;
|
||||
import sun.nio.ch.DirectBuffer;
|
||||
|
||||
import static java.util.zip.ZipUtils.NIO_ACCESS;
|
||||
|
||||
/**
|
||||
* A class that can be used to compute the CRC-32C of a data stream.
|
||||
*
|
||||
|
@ -171,11 +172,12 @@ public final class CRC32C implements Checksum {
|
|||
}
|
||||
|
||||
if (buffer.isDirect()) {
|
||||
NIO_ACCESS.acquireSession(buffer);
|
||||
try {
|
||||
crc = updateDirectByteBuffer(crc, ((DirectBuffer) buffer).address(),
|
||||
crc = updateDirectByteBuffer(crc, ((DirectBuffer)buffer).address(),
|
||||
pos, limit);
|
||||
} finally {
|
||||
Reference.reachabilityFence(buffer);
|
||||
NIO_ACCESS.releaseSession(buffer);
|
||||
}
|
||||
} else if (buffer.hasArray()) {
|
||||
crc = updateBytes(crc, buffer.array(), pos + buffer.arrayOffset(),
|
||||
|
|
|
@ -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 compression using the
|
||||
* popular ZLIB compression library. The ZLIB compression library was
|
||||
|
@ -337,11 +338,12 @@ public class Deflater {
|
|||
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);
|
||||
|
@ -587,6 +589,7 @@ public class Deflater {
|
|||
inputPos = input.position();
|
||||
int inputRem = Math.max(input.limit() - inputPos, 0);
|
||||
if (input.isDirect()) {
|
||||
NIO_ACCESS.acquireSession(input);
|
||||
try {
|
||||
long inputAddress = ((DirectBuffer) input).address();
|
||||
result = deflateBufferBytes(zsRef.address(),
|
||||
|
@ -594,7 +597,7 @@ public class Deflater {
|
|||
output, off, len,
|
||||
flush, params);
|
||||
} finally {
|
||||
Reference.reachabilityFence(input);
|
||||
NIO_ACCESS.releaseSession(input);
|
||||
}
|
||||
} else {
|
||||
byte[] inputArray = ZipUtils.getBufferArray(input);
|
||||
|
@ -709,14 +712,15 @@ public class Deflater {
|
|||
if (input == null) {
|
||||
inputPos = this.inputPos;
|
||||
if (output.isDirect()) {
|
||||
long outputAddress = ((DirectBuffer) output).address();
|
||||
NIO_ACCESS.acquireSession(output);
|
||||
try {
|
||||
long outputAddress = ((DirectBuffer) output).address();
|
||||
result = deflateBytesBuffer(zsRef.address(),
|
||||
inputArray, inputPos, inputLim - inputPos,
|
||||
outputAddress + outputPos, outputRem,
|
||||
flush, params);
|
||||
} finally {
|
||||
Reference.reachabilityFence(output);
|
||||
NIO_ACCESS.releaseSession(output);
|
||||
}
|
||||
} else {
|
||||
byte[] outputArray = ZipUtils.getBufferArray(output);
|
||||
|
@ -730,17 +734,19 @@ public class Deflater {
|
|||
inputPos = input.position();
|
||||
int inputRem = Math.max(input.limit() - inputPos, 0);
|
||||
if (input.isDirect()) {
|
||||
long inputAddress = ((DirectBuffer) input).address();
|
||||
NIO_ACCESS.acquireSession(input);
|
||||
try {
|
||||
long inputAddress = ((DirectBuffer) input).address();
|
||||
if (output.isDirect()) {
|
||||
long outputAddress = outputPos + ((DirectBuffer) output).address();
|
||||
NIO_ACCESS.acquireSession(output);
|
||||
try {
|
||||
long outputAddress = outputPos + ((DirectBuffer) output).address();
|
||||
result = deflateBufferBuffer(zsRef.address(),
|
||||
inputAddress + inputPos, inputRem,
|
||||
outputAddress, outputRem,
|
||||
flush, params);
|
||||
} finally {
|
||||
Reference.reachabilityFence(output);
|
||||
NIO_ACCESS.releaseSession(output);
|
||||
}
|
||||
} else {
|
||||
byte[] outputArray = ZipUtils.getBufferArray(output);
|
||||
|
@ -751,20 +757,21 @@ public class Deflater {
|
|||
flush, params);
|
||||
}
|
||||
} 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 = deflateBytesBuffer(zsRef.address(),
|
||||
inputArray, inputOffset + inputPos, inputRem,
|
||||
outputAddress + outputPos, outputRem,
|
||||
flush, params);
|
||||
} finally {
|
||||
Reference.reachabilityFence(output);
|
||||
NIO_ACCESS.releaseSession(output);
|
||||
}
|
||||
} else {
|
||||
byte[] outputArray = ZipUtils.getBufferArray(output);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -36,10 +36,14 @@ import java.util.concurrent.TimeUnit;
|
|||
|
||||
import static java.util.zip.ZipConstants.ENDHDR;
|
||||
|
||||
import jdk.internal.access.JavaNioAccess;
|
||||
import jdk.internal.access.SharedSecrets;
|
||||
import jdk.internal.misc.Unsafe;
|
||||
|
||||
class ZipUtils {
|
||||
|
||||
static final JavaNioAccess NIO_ACCESS = SharedSecrets.getJavaNioAccess();
|
||||
|
||||
// used to adjust values between Windows and java epoch
|
||||
private static final long WINDOWS_EPOCH_IN_MICROSECONDS = -11644473600000000L;
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue