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) {