Not use safeRelease(...) but release(...) to release non-readable holders to ensure we not mask errors.

Motivation:

AbstractChannel attempts to "filter" messages which are written [1]. A goal of this process is to copy from heap to direct if necessary. However implementations of this method [2][3] may translate a buffer with 0 readable bytes to EMPTY_BUFFER. This may mask a user error where an empty buffer is written but already released.

Modifications:

Replace safeRelease(...) with release(...) to ensure we propagate reference count issues.

Result:

Fixes [#7383]
This commit is contained in:
Norman Maurer 2017-11-25 21:10:29 +01:00
parent 95b02e49ac
commit 251bb1a739
2 changed files with 2 additions and 2 deletions

View File

@ -302,7 +302,7 @@ abstract class AbstractEpollChannel extends AbstractChannel implements UnixChann
protected final ByteBuf newDirectBuffer(Object holder, ByteBuf buf) { protected final ByteBuf newDirectBuffer(Object holder, ByteBuf buf) {
final int readableBytes = buf.readableBytes(); final int readableBytes = buf.readableBytes();
if (readableBytes == 0) { if (readableBytes == 0) {
ReferenceCountUtil.safeRelease(holder); ReferenceCountUtil.release(holder);
return Unpooled.EMPTY_BUFFER; return Unpooled.EMPTY_BUFFER;
} }

View File

@ -248,7 +248,7 @@ abstract class AbstractKQueueChannel extends AbstractChannel implements UnixChan
protected final ByteBuf newDirectBuffer(Object holder, ByteBuf buf) { protected final ByteBuf newDirectBuffer(Object holder, ByteBuf buf) {
final int readableBytes = buf.readableBytes(); final int readableBytes = buf.readableBytes();
if (readableBytes == 0) { if (readableBytes == 0) {
ReferenceCountUtil.safeRelease(holder); ReferenceCountUtil.release(holder);
return Unpooled.EMPTY_BUFFER; return Unpooled.EMPTY_BUFFER;
} }