From b5b53daf91f8ea12772b848369f3510641853e2f Mon Sep 17 00:00:00 2001 From: Jason Tedor Date: Wed, 4 Oct 2017 12:06:59 -0400 Subject: [PATCH] Do not treat errors as decoder exception (redux) Motivation: Today when Netty encounters a general error while decoding it treats this as a decoder exception. However, for fatal causes this should not be treated as such, instead the fatal error should be carried up the stack without the callee having to unwind causes. This was probably done for byte to byte message decoder but is now done for all decoders. Modifications: Instead of translating any error to a decoder exception, we let those unwind out the stack (note that finally blocks still execute) except in places where an event needs to fire where we fire with the error instead of wrapping in a decoder exception. Result: Fatal errors will not be treated as innocent decoder exceptions. --- .../handler/codec/haproxy/HAProxyMessageDecoder.java | 10 +++++----- .../java/io/netty/handler/codec/ReplayingDecoder.java | 2 +- .../src/main/java/io/netty/handler/ssl/SniHandler.java | 5 +---- 3 files changed, 7 insertions(+), 10 deletions(-) diff --git a/codec-haproxy/src/main/java/io/netty/handler/codec/haproxy/HAProxyMessageDecoder.java b/codec-haproxy/src/main/java/io/netty/handler/codec/haproxy/HAProxyMessageDecoder.java index 04c744811f..df2a663e89 100644 --- a/codec-haproxy/src/main/java/io/netty/handler/codec/haproxy/HAProxyMessageDecoder.java +++ b/codec-haproxy/src/main/java/io/netty/handler/codec/haproxy/HAProxyMessageDecoder.java @@ -355,16 +355,16 @@ public class HAProxyMessageDecoder extends ByteToMessageDecoder { fail(ctx, "header length (" + length + ") exceeds the allowed maximum (" + maxLength + ')', null); } - private void fail(final ChannelHandlerContext ctx, String errMsg, Throwable t) { + private void fail(final ChannelHandlerContext ctx, String errMsg, Exception e) { finished = true; ctx.close(); // drop connection immediately per spec HAProxyProtocolException ppex; - if (errMsg != null && t != null) { - ppex = new HAProxyProtocolException(errMsg, t); + if (errMsg != null && e != null) { + ppex = new HAProxyProtocolException(errMsg, e); } else if (errMsg != null) { ppex = new HAProxyProtocolException(errMsg); - } else if (t != null) { - ppex = new HAProxyProtocolException(t); + } else if (e != null) { + ppex = new HAProxyProtocolException(e); } else { ppex = new HAProxyProtocolException(); } diff --git a/codec/src/main/java/io/netty/handler/codec/ReplayingDecoder.java b/codec/src/main/java/io/netty/handler/codec/ReplayingDecoder.java index cd66c75502..3498fde1cb 100644 --- a/codec/src/main/java/io/netty/handler/codec/ReplayingDecoder.java +++ b/codec/src/main/java/io/netty/handler/codec/ReplayingDecoder.java @@ -418,7 +418,7 @@ public abstract class ReplayingDecoder extends ByteToMessageDecoder { } } catch (DecoderException e) { throw e; - } catch (Throwable cause) { + } catch (Exception cause) { throw new DecoderException(cause); } } diff --git a/handler/src/main/java/io/netty/handler/ssl/SniHandler.java b/handler/src/main/java/io/netty/handler/ssl/SniHandler.java index 8c9e7b5a6e..140d2209ae 100644 --- a/handler/src/main/java/io/netty/handler/ssl/SniHandler.java +++ b/handler/src/main/java/io/netty/handler/ssl/SniHandler.java @@ -22,9 +22,6 @@ import io.netty.handler.codec.ByteToMessageDecoder; import io.netty.util.CharsetUtil; import io.netty.util.DomainNameMapping; import io.netty.util.ReferenceCountUtil; -import io.netty.util.concurrent.Future; -import io.netty.util.concurrent.FutureListener; -import io.netty.util.concurrent.Promise; import io.netty.util.internal.PlatformDependent; import io.netty.util.internal.logging.InternalLogger; import io.netty.util.internal.logging.InternalLoggerFactory; @@ -242,7 +239,7 @@ public class SniHandler extends ByteToMessageDecoder { break loop; } } - } catch (Throwable e) { + } catch (Exception e) { // unexpected encoding, ignore sni and use default if (logger.isDebugEnabled()) { logger.debug("Unexpected client hello packet: " + ByteBufUtil.hexDump(in), e);