From a3b4cdd614d0ecd20c1b23758df969df0ca410a4 Mon Sep 17 00:00:00 2001 From: Trustin Lee Date: Fri, 24 May 2013 11:54:44 +0900 Subject: [PATCH] Fix StackOverflowError in LocalEcho.doBeginRead() when the peer channel keeps writing data - Fixes #1380 --- .../io/netty/channel/local/LocalChannel.java | 31 +++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/transport/src/main/java/io/netty/channel/local/LocalChannel.java b/transport/src/main/java/io/netty/channel/local/LocalChannel.java index 7142304223..ec91950d85 100755 --- a/transport/src/main/java/io/netty/channel/local/LocalChannel.java +++ b/transport/src/main/java/io/netty/channel/local/LocalChannel.java @@ -43,7 +43,24 @@ public class LocalChannel extends AbstractChannel { private static final ChannelMetadata METADATA = new ChannelMetadata(BufType.MESSAGE, false); + private static final int MAX_READER_STACK_DEPTH = 8; + private static final ThreadLocal READER_STACK_DEPTH = new ThreadLocal() { + @Override + protected Integer initialValue() { + return 0; + } + }; + private final ChannelConfig config = new DefaultChannelConfig(this); + private final Runnable readTask = new Runnable() { + @Override + public void run() { + ChannelPipeline pipeline = pipeline(); + pipeline.fireInboundBufferUpdated(); + pipeline.fireChannelReadSuspended(); + } + }; + private final Runnable shutdownHook = new Runnable() { @Override public void run() { @@ -225,8 +242,18 @@ public class LocalChannel extends AbstractChannel { return; } - pipeline.fireInboundBufferUpdated(); - pipeline.fireChannelReadSuspended(); + final Integer stackDepth = READER_STACK_DEPTH.get(); + if (stackDepth < MAX_READER_STACK_DEPTH) { + READER_STACK_DEPTH.set(stackDepth + 1); + try { + pipeline.fireInboundBufferUpdated(); + pipeline.fireChannelReadSuspended(); + } finally { + READER_STACK_DEPTH.set(stackDepth); + } + } else { + eventLoop().execute(readTask); + } } @Override