From 6278d88d2f46e5facebc805b1dc0cd015eaf35b9 Mon Sep 17 00:00:00 2001 From: Norman Maurer Date: Fri, 26 Jul 2013 11:46:26 +0200 Subject: [PATCH] [#1656] Fix IndexOutOfBoundsException in MessageToMessageException --- .../codec/MessageToMessageEncoder.java | 8 ++-- .../codec/MessageToMessageEncoderTest.java | 40 +++++++++++++++++++ 2 files changed, 45 insertions(+), 3 deletions(-) create mode 100644 codec/src/test/java/io/netty/handler/codec/MessageToMessageEncoderTest.java diff --git a/codec/src/main/java/io/netty/handler/codec/MessageToMessageEncoder.java b/codec/src/main/java/io/netty/handler/codec/MessageToMessageEncoder.java index 401f35ed12..d0e98efa44 100644 --- a/codec/src/main/java/io/netty/handler/codec/MessageToMessageEncoder.java +++ b/codec/src/main/java/io/netty/handler/codec/MessageToMessageEncoder.java @@ -108,10 +108,12 @@ public abstract class MessageToMessageEncoder extends ChannelOutboundHandlerA } finally { if (out != null) { final int sizeMinusOne = out.size() - 1; - for (int i = 0; i < sizeMinusOne; i ++) { - ctx.write(out.get(i)); + if (sizeMinusOne >= 0) { + for (int i = 0; i < sizeMinusOne; i ++) { + ctx.write(out.get(i)); + } + ctx.write(out.get(sizeMinusOne), promise); } - ctx.write(out.get(sizeMinusOne), promise); out.recycle(); } } diff --git a/codec/src/test/java/io/netty/handler/codec/MessageToMessageEncoderTest.java b/codec/src/test/java/io/netty/handler/codec/MessageToMessageEncoderTest.java new file mode 100644 index 0000000000..322631adf6 --- /dev/null +++ b/codec/src/test/java/io/netty/handler/codec/MessageToMessageEncoderTest.java @@ -0,0 +1,40 @@ +/* + * Copyright 2013 The Netty Project + * + * The Netty Project licenses this file to you under the Apache License, + * version 2.0 (the "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ +package io.netty.handler.codec; + +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.embedded.EmbeddedChannel; +import org.junit.Test; + +import java.util.List; + + +public class MessageToMessageEncoderTest { + + /** + * Test-case for https://github.com/netty/netty/issues/1656 + */ + @Test(expected = EncoderException.class) + public void testException() { + EmbeddedChannel channel = new EmbeddedChannel(new MessageToMessageEncoder() { + @Override + protected void encode(ChannelHandlerContext ctx, Object msg, List out) throws Exception { + throw new Exception(); + } + }); + channel.writeOutbound(new Object()); + } +}