Fix IllegalArgumentException when release a wrapped ByteBuffer on Java9
Motivation: Unsafe.invokeCleaner(...) checks if the passed in ByteBuffer is a slice or duplicate and if so throws an IllegalArgumentException on Java9. We need to ensure we never try to free a ByteBuffer that was provided by the user directly as we not know if its a slice / duplicate or not. Modifications: Never try to free a ByteBuffer that was passed into UnpooledUnsafeDirectByteBuf constructor by an user (via Unpooled.wrappedBuffer(....)). Result: Build passes again on Java9
This commit is contained in:
parent
970d310ec9
commit
bf0beb772c
@ -74,7 +74,16 @@ public class UnpooledUnsafeDirectByteBuf extends AbstractReferenceCountedByteBuf
|
||||
* @param maxCapacity the maximum capacity of the underlying direct buffer
|
||||
*/
|
||||
protected UnpooledUnsafeDirectByteBuf(ByteBufAllocator alloc, ByteBuffer initialBuffer, int maxCapacity) {
|
||||
this(alloc, initialBuffer, maxCapacity, true);
|
||||
// We never try to free the buffer if it was provided by the end-user as we not know if this is an duplicate or
|
||||
// an slice. This is done to prevent an IllegalArgumentException when using Java9 as Unsafe.invokeCleaner(...)
|
||||
// will check if the given buffer is either an duplicate or slice and in this case throw an
|
||||
// IllegalArgumentException.
|
||||
//
|
||||
// See http://hg.openjdk.java.net/jdk9/hs-demo/jdk/file/0d2ab72ba600/src/jdk.unsupported/share/classes/
|
||||
// sun/misc/Unsafe.java#l1250
|
||||
//
|
||||
// We also call slice() explicitly here to preserve behaviour with previous netty releases.
|
||||
this(alloc, initialBuffer.slice(), maxCapacity, false);
|
||||
}
|
||||
|
||||
UnpooledUnsafeDirectByteBuf(ByteBufAllocator alloc, ByteBuffer initialBuffer, int maxCapacity, boolean doFree) {
|
||||
@ -100,7 +109,7 @@ public class UnpooledUnsafeDirectByteBuf extends AbstractReferenceCountedByteBuf
|
||||
|
||||
this.alloc = alloc;
|
||||
doNotFree = !doFree;
|
||||
setByteBuffer(initialBuffer.slice().order(ByteOrder.BIG_ENDIAN), false);
|
||||
setByteBuffer(initialBuffer.order(ByteOrder.BIG_ENDIAN), false);
|
||||
writerIndex(initialCapacity);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user