diff --git a/codec-dns/src/main/java/io/netty/handler/codec/dns/DnsResponseDecoder.java b/codec-dns/src/main/java/io/netty/handler/codec/dns/DnsResponseDecoder.java index 28d438a79c..957055adb9 100644 --- a/codec-dns/src/main/java/io/netty/handler/codec/dns/DnsResponseDecoder.java +++ b/codec-dns/src/main/java/io/netty/handler/codec/dns/DnsResponseDecoder.java @@ -64,16 +64,35 @@ public class DnsResponseDecoder extends MessageToMessageDecoder out.add(response); return; } - for (int i = 0; i < answers; i++) { - response.addAnswer(decodeResource(buf)); + boolean release = true; + try { + for (int i = 0; i < answers; i++) { + response.addAnswer(decodeResource(buf)); + } + for (int i = 0; i < authorities; i++) { + response.addAuthorityResource(decodeResource(buf)); + } + for (int i = 0; i < additionals; i++) { + response.addAdditionalResource(decodeResource(buf)); + } + out.add(response); + release = false; + } finally { + if (release) { + // We need to release te DnsResources in case of an Exception as we called retain() on the buffer. + releaseDnsResources(response.answers()); + releaseDnsResources(response.authorityResources()); + releaseDnsResources(response.additionalResources()); + } } - for (int i = 0; i < authorities; i++) { - response.addAuthorityResource(decodeResource(buf)); + } + + private static void releaseDnsResources(List resources) { + int size = resources.size(); + for (int i = 0; i < size; i++) { + DnsResource resource = resources.get(i); + resource.release(); } - for (int i = 0; i < additionals; i++) { - response.addAdditionalResource(decodeResource(buf)); - } - out.add(response); } /** diff --git a/codec-dns/src/test/java/io/netty/handler/codec/dns/DnsResponseTest.java b/codec-dns/src/test/java/io/netty/handler/codec/dns/DnsResponseTest.java index 707f0135cb..7d860fed37 100644 --- a/codec-dns/src/test/java/io/netty/handler/codec/dns/DnsResponseTest.java +++ b/codec-dns/src/test/java/io/netty/handler/codec/dns/DnsResponseTest.java @@ -74,7 +74,6 @@ public class DnsResponseTest { ByteBuf packet = embedder.alloc().buffer(512).writeBytes(p); embedder.writeInbound(new DatagramPacket(packet, null, new InetSocketAddress(0))); DnsResponse decoded = embedder.readInbound(); - packet.retain().readerIndex(0); ByteBuf raw = Unpooled.wrappedBuffer(p); Assert.assertEquals("Invalid id, expected: " + raw.getUnsignedShort(0) + ", actual: " + decoded.header().id(), raw.getUnsignedShort(0), decoded.header().id());