Fix buffer leak in EpollDatagramChannel

Motivation:
EpollDatagramChannel produced buffer leaks when tried to read from the channel and nothing was ready to be read.

Modifications:
Correctly release buffer if nothing was read

Result:
No buffer leak
This commit is contained in:
Norman Maurer 2014-04-18 20:34:37 +02:00
parent 97553069b6
commit d6ec44c871

View File

@ -376,12 +376,11 @@ public final class EpollDatagramChannel extends AbstractEpollChannel implements
assert eventLoop().inEventLoop();
final ChannelPipeline pipeline = pipeline();
Throwable exception = null;
try {
try {
for (;;) {
boolean free = true;
ByteBuf data = allocHandle.allocate(config.getAllocator());
ByteBuf data = null;
try {
data = allocHandle.allocate(config.getAllocator());
int writerIndex = data.writerIndex();
DatagramSocketAddress remoteAddress;
if (data.hasMemoryAddress()) {
@ -401,29 +400,20 @@ public final class EpollDatagramChannel extends AbstractEpollChannel implements
int readBytes = remoteAddress.receivedAmount;
data.writerIndex(data.writerIndex() + readBytes);
allocHandle.record(readBytes);
try {
readPending = false;
pipeline.fireChannelRead(
new DatagramPacket(data, (InetSocketAddress) localAddress(), remoteAddress));
free = false;
data = null;
} catch (Throwable t) {
// keep on reading as we use epoll ET and need to consume everything from the socket
pipeline.fireChannelReadComplete();
pipeline.fireExceptionCaught(t);
} finally {
if (free) {
if (data != null) {
data.release();
}
}
}
} catch (Throwable t) {
exception = t;
}
pipeline.fireChannelReadComplete();
if (exception != null) {
pipeline.fireExceptionCaught(exception);
}
} finally {
// Check if there is a readPending which was not processed yet.
// This could be for two reasons: