diff --git a/buffer-api/src/main/java/io/netty/buffer/api/MemoryManagers.java b/buffer-api/src/main/java/io/netty/buffer/api/MemoryManagers.java index 92322bf..c9a4af4 100644 --- a/buffer-api/src/main/java/io/netty/buffer/api/MemoryManagers.java +++ b/buffer-api/src/main/java/io/netty/buffer/api/MemoryManagers.java @@ -65,7 +65,7 @@ public interface MemoryManagers { } /** - * Find a {@link MemoryManagers} implementation by its {@linkplain #implementationName() implementation name}. + * Find a {@link MemoryManagers} implementation by its {@linkplain #getImplementationName() implementation name}. *

* Note: All available {@link MemoryManagers} instances are service loaded and instantiated every time this * method is called. @@ -82,7 +82,7 @@ public interface MemoryManagers { return Stream.empty(); } }) - .filter(impl -> implementationName.equals(impl.implementationName())) + .filter(impl -> implementationName.equals(impl.getImplementationName())) .findFirst(); } @@ -106,5 +106,5 @@ public interface MemoryManagers { * * @return The name of this memory managers implementation. */ - String implementationName(); + String getImplementationName(); } diff --git a/buffer-api/src/main/java/io/netty/buffer/api/adaptor/ByteBufAdaptor.java b/buffer-api/src/main/java/io/netty/buffer/api/adaptor/ByteBufAdaptor.java index 5b65400..0d95e23 100644 --- a/buffer-api/src/main/java/io/netty/buffer/api/adaptor/ByteBufAdaptor.java +++ b/buffer-api/src/main/java/io/netty/buffer/api/adaptor/ByteBufAdaptor.java @@ -1678,6 +1678,9 @@ public final class ByteBufAdaptor extends ByteBuf { @Override public boolean release(int decrement) { + if (!buffer.isAccessible() || decrement > 1 + Statics.countBorrows((ResourceSupport) buffer)) { + throw new IllegalReferenceCountException(); + } for (int i = 0; i < decrement; i++) { try { buffer.close(); diff --git a/buffer-api/src/main/java/io/netty/buffer/api/bytebuffer/ByteBufferMemoryManagers.java b/buffer-api/src/main/java/io/netty/buffer/api/bytebuffer/ByteBufferMemoryManagers.java index cb33511..56e731f 100644 --- a/buffer-api/src/main/java/io/netty/buffer/api/bytebuffer/ByteBufferMemoryManagers.java +++ b/buffer-api/src/main/java/io/netty/buffer/api/bytebuffer/ByteBufferMemoryManagers.java @@ -30,7 +30,7 @@ public class ByteBufferMemoryManagers implements MemoryManagers { } @Override - public String implementationName() { + public String getImplementationName() { return "ByteBuffer"; } diff --git a/buffer-api/src/main/java/io/netty/buffer/api/bytebuffer/NioBuffer.java b/buffer-api/src/main/java/io/netty/buffer/api/bytebuffer/NioBuffer.java index 329b347..7bbdda2 100644 --- a/buffer-api/src/main/java/io/netty/buffer/api/bytebuffer/NioBuffer.java +++ b/buffer-api/src/main/java/io/netty/buffer/api/bytebuffer/NioBuffer.java @@ -32,6 +32,7 @@ import io.netty.buffer.api.WritableComponent; import io.netty.buffer.api.WritableComponentProcessor; import io.netty.buffer.api.internal.ArcDrop; import io.netty.buffer.api.internal.Statics; +import io.netty.util.IllegalReferenceCountException; import io.netty.util.ReferenceCounted; import io.netty.util.internal.PlatformDependent; @@ -1245,6 +1246,9 @@ class NioBuffer extends ResourceSupport implements Buffer, Re @Override public boolean release(int decrement) { + if (!isAccessible() || decrement > 1 + countBorrows()) { + throw new IllegalReferenceCountException(); + } for (int i = 0; i < decrement; i++) { close(); } diff --git a/buffer-api/src/main/java/io/netty/buffer/api/unsafe/UnsafeBuffer.java b/buffer-api/src/main/java/io/netty/buffer/api/unsafe/UnsafeBuffer.java index 793688b..8490a4f 100644 --- a/buffer-api/src/main/java/io/netty/buffer/api/unsafe/UnsafeBuffer.java +++ b/buffer-api/src/main/java/io/netty/buffer/api/unsafe/UnsafeBuffer.java @@ -32,6 +32,7 @@ import io.netty.buffer.api.WritableComponent; import io.netty.buffer.api.WritableComponentProcessor; import io.netty.buffer.api.internal.ArcDrop; import io.netty.buffer.api.internal.Statics; +import io.netty.util.IllegalReferenceCountException; import io.netty.util.ReferenceCounted; import io.netty.util.internal.PlatformDependent; @@ -1660,6 +1661,9 @@ class UnsafeBuffer extends ResourceSupport implements Buff @Override public boolean release(int decrement) { + if (!isAccessible() || decrement > 1 + countBorrows()) { + throw new IllegalReferenceCountException(); + } for (int i = 0; i < decrement; i++) { close(); } diff --git a/buffer-api/src/main/java/io/netty/buffer/api/unsafe/UnsafeMemoryManagers.java b/buffer-api/src/main/java/io/netty/buffer/api/unsafe/UnsafeMemoryManagers.java index 0c4ef5c..41a11ae 100644 --- a/buffer-api/src/main/java/io/netty/buffer/api/unsafe/UnsafeMemoryManagers.java +++ b/buffer-api/src/main/java/io/netty/buffer/api/unsafe/UnsafeMemoryManagers.java @@ -40,7 +40,7 @@ public class UnsafeMemoryManagers implements MemoryManagers { } @Override - public String implementationName() { + public String getImplementationName() { return "Unsafe"; } diff --git a/buffer-memseg/src/main/java/io/netty/buffer/api/memseg/MemSegBuffer.java b/buffer-memseg/src/main/java/io/netty/buffer/api/memseg/MemSegBuffer.java index 07b6b2f..b63e526 100644 --- a/buffer-memseg/src/main/java/io/netty/buffer/api/memseg/MemSegBuffer.java +++ b/buffer-memseg/src/main/java/io/netty/buffer/api/memseg/MemSegBuffer.java @@ -32,6 +32,7 @@ import io.netty.buffer.api.WritableComponentProcessor; import io.netty.buffer.api.Drop; import io.netty.buffer.api.Owned; import io.netty.buffer.api.internal.ResourceSupport; +import io.netty.util.IllegalReferenceCountException; import jdk.incubator.foreign.MemorySegment; import jdk.incubator.foreign.ResourceScope; @@ -1266,6 +1267,9 @@ class MemSegBuffer extends ResourceSupport implements Buff @Override public boolean release(int decrement) { + if (!isAccessible() || decrement > 1 + countBorrows()) { + throw new IllegalReferenceCountException(); + } for (int i = 0; i < decrement; i++) { close(); } diff --git a/buffer-memseg/src/main/java/io/netty/buffer/api/memseg/SegmentMemoryManagers.java b/buffer-memseg/src/main/java/io/netty/buffer/api/memseg/SegmentMemoryManagers.java index e28561f..9d1d6dc 100644 --- a/buffer-memseg/src/main/java/io/netty/buffer/api/memseg/SegmentMemoryManagers.java +++ b/buffer-memseg/src/main/java/io/netty/buffer/api/memseg/SegmentMemoryManagers.java @@ -30,7 +30,7 @@ public class SegmentMemoryManagers implements MemoryManagers { } @Override - public String implementationName() { + public String getImplementationName() { return "MemorySegment"; } diff --git a/buffer-tests/src/test/java/io/netty/buffer/api/tests/adaptor/AbstractByteBufTest.java b/buffer-tests/src/test/java/io/netty/buffer/api/tests/adaptor/AbstractByteBufTest.java index 8f27894..b445cb2 100644 --- a/buffer-tests/src/test/java/io/netty/buffer/api/tests/adaptor/AbstractByteBufTest.java +++ b/buffer-tests/src/test/java/io/netty/buffer/api/tests/adaptor/AbstractByteBufTest.java @@ -61,6 +61,7 @@ import static io.netty.buffer.Unpooled.directBuffer; import static io.netty.buffer.Unpooled.unreleasableBuffer; import static io.netty.buffer.Unpooled.wrappedBuffer; import static io.netty.util.internal.EmptyArrays.EMPTY_BYTES; +import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertArrayEquals; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; @@ -3463,6 +3464,15 @@ public abstract class AbstractByteBufTest { assertThrows(IllegalReferenceCountException.class, () -> releasedBuffer().release()); } + @Test + public void overReleasingMustNotCloseBuffer() { + ByteBuf buf = newBuffer(1); + assertThrows(IllegalReferenceCountException.class, () -> buf.release(10)); + assertThrows(IllegalReferenceCountException.class, () -> buf.release(2)); + assertThat(buf.refCnt()).isNotZero(); + assertTrue(buf.release()); + } + private static void assertDuplicateFailAfterRelease(ByteBuf... bufs) { for (ByteBuf buf : bufs) { if (buf.refCnt() > 0) {