ByteBuf#ensureWritable(int, boolean) should not throw
Motivation: The javadocs for ByteBuf#ensureWritable(int, boolean) indicate that it should not throw, and instead the return code should indicate the result of the operation. Due to a bug in AbstractByteBuf it is possible for a resize to be attempted on a buffer that may exceed maxCapacity() and therefore throw. Modifications: - If there is not enough space in the buffer, and force is false, then a resize should not be attempted Result: AbstractByteBuf#ensureWritable(int, boolean) enforces the javadoc constraints and does not throw.
This commit is contained in:
parent
141089998f
commit
63f5cdb0d5
@ -295,15 +295,15 @@ public abstract class AbstractByteBuf extends ByteBuf {
|
||||
return 0;
|
||||
}
|
||||
|
||||
final int maxCapacity = maxCapacity();
|
||||
final int writerIndex = writerIndex();
|
||||
if (minWritableBytes > maxCapacity - writerIndex) {
|
||||
if (force) {
|
||||
if (capacity() == maxCapacity()) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
capacity(maxCapacity());
|
||||
return 3;
|
||||
if (!force || capacity() == maxCapacity) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
capacity(maxCapacity);
|
||||
return 3;
|
||||
}
|
||||
|
||||
// Normalize the current capacity to the power of 2.
|
||||
|
@ -2471,6 +2471,23 @@ public abstract class AbstractByteBufTest {
|
||||
buffer.release();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void ensureWritableWithForceDoesNotThrow() {
|
||||
ensureWritableDoesNotThrow(true);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void ensureWritableWithOutForceDoesNotThrow() {
|
||||
ensureWritableDoesNotThrow(false);
|
||||
}
|
||||
|
||||
private void ensureWritableDoesNotThrow(boolean force) {
|
||||
final ByteBuf buffer = newBuffer(8);
|
||||
buffer.writerIndex(buffer.capacity());
|
||||
buffer.ensureWritable(8, force);
|
||||
buffer.release();
|
||||
}
|
||||
|
||||
// See:
|
||||
// - https://github.com/netty/netty/issues/2587
|
||||
// - https://github.com/netty/netty/issues/2580
|
||||
|
Loading…
Reference in New Issue
Block a user