From 20894bc99e28191cc3926ae95a23f5c7d3969a33 Mon Sep 17 00:00:00 2001 From: Trustin Lee Date: Tue, 20 Aug 2013 14:28:50 +0900 Subject: [PATCH] Fix a bug in internalNioBuffer() implementations of derived buffers - A user can create multiple duplicates of a buffer and access their internal NIO buffers. (e.g. write multiple duplicates to multiple channels assigned to different event loop.) Because the derived buffers' internalNioBuffer() simply delegates the call to the original buffer, all derived buffers and the original buffer's internalNioBuffer() will return the same buffer, which will lead to a race condition. - Fixes #1739 --- buffer/src/main/java/io/netty/buffer/DuplicatedByteBuf.java | 2 +- buffer/src/main/java/io/netty/buffer/ReadOnlyByteBuf.java | 2 +- buffer/src/main/java/io/netty/buffer/SlicedByteBuf.java | 2 +- buffer/src/main/java/io/netty/buffer/SwappedByteBuf.java | 3 +-- 4 files changed, 4 insertions(+), 5 deletions(-) diff --git a/buffer/src/main/java/io/netty/buffer/DuplicatedByteBuf.java b/buffer/src/main/java/io/netty/buffer/DuplicatedByteBuf.java index 3ec26c6eaa..a5b4588e7d 100644 --- a/buffer/src/main/java/io/netty/buffer/DuplicatedByteBuf.java +++ b/buffer/src/main/java/io/netty/buffer/DuplicatedByteBuf.java @@ -289,7 +289,7 @@ public class DuplicatedByteBuf extends AbstractDerivedByteBuf { @Override public ByteBuffer internalNioBuffer(int index, int length) { - return buffer.internalNioBuffer(index, length); + return buffer.internalNioBuffer(index, length).duplicate(); } @Override diff --git a/buffer/src/main/java/io/netty/buffer/ReadOnlyByteBuf.java b/buffer/src/main/java/io/netty/buffer/ReadOnlyByteBuf.java index 01157b0688..eee506f176 100644 --- a/buffer/src/main/java/io/netty/buffer/ReadOnlyByteBuf.java +++ b/buffer/src/main/java/io/netty/buffer/ReadOnlyByteBuf.java @@ -292,7 +292,7 @@ public class ReadOnlyByteBuf extends AbstractDerivedByteBuf { @Override public ByteBuffer internalNioBuffer(int index, int length) { - return buffer.internalNioBuffer(index, length); + return buffer.internalNioBuffer(index, length).duplicate(); } @Override diff --git a/buffer/src/main/java/io/netty/buffer/SlicedByteBuf.java b/buffer/src/main/java/io/netty/buffer/SlicedByteBuf.java index 561cada37d..93678f648f 100644 --- a/buffer/src/main/java/io/netty/buffer/SlicedByteBuf.java +++ b/buffer/src/main/java/io/netty/buffer/SlicedByteBuf.java @@ -271,7 +271,7 @@ public class SlicedByteBuf extends AbstractDerivedByteBuf { @Override public ByteBuffer internalNioBuffer(int index, int length) { checkIndex(index, length); - return buffer.internalNioBuffer(index + adjustment, length); + return buffer.internalNioBuffer(index + adjustment, length).duplicate(); } @Override diff --git a/buffer/src/main/java/io/netty/buffer/SwappedByteBuf.java b/buffer/src/main/java/io/netty/buffer/SwappedByteBuf.java index c720f44f9d..4d2a1bf82e 100644 --- a/buffer/src/main/java/io/netty/buffer/SwappedByteBuf.java +++ b/buffer/src/main/java/io/netty/buffer/SwappedByteBuf.java @@ -741,8 +741,7 @@ public final class SwappedByteBuf extends ByteBuf { @Override public ByteBuffer internalNioBuffer(int index, int length) { - // Do not mess with the internal buffer's byte order. - return buf.nioBuffer(index, length).order(order); + return buf.internalNioBuffer(index, length).duplicate().order(order); } @Override