Skip to content

Commit 1e0dab1

Browse files
authored
Correctly retain slice when calling ReplayingDecoderByteBuf.retainedS… (#13496)
…lice(...) Motivation: We need to retain the slice when calling retainedSlice(...). Due a bug we did miss to do so. Modifications: - Delegate to the correct method. - Add test-case Result: Fixes #13455
1 parent fa2c81f commit 1e0dab1

2 files changed

Lines changed: 23 additions & 1 deletion

File tree

codec/src/main/java/io/netty/handler/codec/ReplayingDecoderByteBuf.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -869,7 +869,7 @@ public ByteBuf slice(int index, int length) {
869869
@Override
870870
public ByteBuf retainedSlice(int index, int length) {
871871
checkIndex(index, length);
872-
return buffer.slice(index, length);
872+
return buffer.retainedSlice(index, length);
873873
}
874874

875875
@Override

codec/src/test/java/io/netty/handler/codec/ReplayingDecoderByteBufTest.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,4 +104,26 @@ public void testGetBoolean() {
104104
buf.release();
105105
}
106106

107+
// See https://github.com/netty/netty/issues/13455
108+
@Test
109+
void testRetainedSlice() {
110+
ByteBuf buf = Unpooled.buffer(10);
111+
int i = 0;
112+
while (buf.isWritable()) {
113+
buf.writeByte(i++);
114+
}
115+
ReplayingDecoderByteBuf buffer = new ReplayingDecoderByteBuf(buf);
116+
ByteBuf slice = buffer.retainedSlice(0, 4);
117+
assertEquals(2, slice.refCnt());
118+
119+
i = 0;
120+
while (slice.isReadable()) {
121+
assertEquals(i++, slice.readByte());
122+
}
123+
slice.release();
124+
buf.release();
125+
assertEquals(0, slice.refCnt());
126+
assertEquals(0, buf.refCnt());
127+
assertEquals(0, buffer.refCnt());
128+
}
107129
}

0 commit comments

Comments
 (0)