Skip to content
This repository was archived by the owner on Dec 12, 2022. It is now read-only.

Commit 56bfa22

Browse files
committed
Align Buffer.get* bounds checks with their documented behaviour
The get* methods bounds checking accesses between 0 and the write offset, and the tests were confirming this behaviour. This was wrong because it is not symmetric with the set* methods, which bounds check between 0 and the capacity, and does not modify the write offset. The tests and methods have been updated so the get* methods now bounds check between 0 and the capacity.
1 parent f460c73 commit 56bfa22

File tree

3 files changed

+486
-103
lines changed

3 files changed

+486
-103
lines changed

src/main/java/io/netty/buffer/api/CompositeBuffer.java

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -877,7 +877,7 @@ public byte readByte() {
877877

878878
@Override
879879
public byte getByte(int roff) {
880-
return prepRead(roff, Byte.BYTES).getByte(subOffset);
880+
return prepGet(roff, Byte.BYTES).getByte(subOffset);
881881
}
882882

883883
@Override
@@ -887,7 +887,7 @@ public int readUnsignedByte() {
887887

888888
@Override
889889
public int getUnsignedByte(int roff) {
890-
return prepRead(roff, Byte.BYTES).getUnsignedByte(subOffset);
890+
return prepGet(roff, Byte.BYTES).getUnsignedByte(subOffset);
891891
}
892892

893893
@Override
@@ -921,7 +921,7 @@ public char readChar() {
921921

922922
@Override
923923
public char getChar(int roff) {
924-
return prepRead(roff, 2).getChar(subOffset);
924+
return prepGet(roff, 2).getChar(subOffset);
925925
}
926926

927927
@Override
@@ -943,7 +943,7 @@ public short readShort() {
943943

944944
@Override
945945
public short getShort(int roff) {
946-
return prepRead(roff, Short.BYTES).getShort(subOffset);
946+
return prepGet(roff, Short.BYTES).getShort(subOffset);
947947
}
948948

949949
@Override
@@ -953,7 +953,7 @@ public int readUnsignedShort() {
953953

954954
@Override
955955
public int getUnsignedShort(int roff) {
956-
return prepRead(roff, Short.BYTES).getUnsignedShort(subOffset);
956+
return prepGet(roff, Short.BYTES).getUnsignedShort(subOffset);
957957
}
958958

959959
@Override
@@ -987,7 +987,7 @@ public int readMedium() {
987987

988988
@Override
989989
public int getMedium(int roff) {
990-
return prepRead(roff, 3).getMedium(subOffset);
990+
return prepGet(roff, 3).getMedium(subOffset);
991991
}
992992

993993
@Override
@@ -997,7 +997,7 @@ public int readUnsignedMedium() {
997997

998998
@Override
999999
public int getUnsignedMedium(int roff) {
1000-
return prepRead(roff, 3).getMedium(subOffset);
1000+
return prepGet(roff, 3).getMedium(subOffset);
10011001
}
10021002

10031003
@Override
@@ -1031,7 +1031,7 @@ public int readInt() {
10311031

10321032
@Override
10331033
public int getInt(int roff) {
1034-
return prepRead(roff, Integer.BYTES).getInt(subOffset);
1034+
return prepGet(roff, Integer.BYTES).getInt(subOffset);
10351035
}
10361036

10371037
@Override
@@ -1041,7 +1041,7 @@ public long readUnsignedInt() {
10411041

10421042
@Override
10431043
public long getUnsignedInt(int roff) {
1044-
return prepRead(roff, Integer.BYTES).getUnsignedInt(subOffset);
1044+
return prepGet(roff, Integer.BYTES).getUnsignedInt(subOffset);
10451045
}
10461046

10471047
@Override
@@ -1075,7 +1075,7 @@ public float readFloat() {
10751075

10761076
@Override
10771077
public float getFloat(int roff) {
1078-
return prepRead(roff, Float.BYTES).getFloat(subOffset);
1078+
return prepGet(roff, Float.BYTES).getFloat(subOffset);
10791079
}
10801080

10811081
@Override
@@ -1097,7 +1097,7 @@ public long readLong() {
10971097

10981098
@Override
10991099
public long getLong(int roff) {
1100-
return prepRead(roff, Long.BYTES).getLong(subOffset);
1100+
return prepGet(roff, Long.BYTES).getLong(subOffset);
11011101
}
11021102

11031103
@Override
@@ -1119,7 +1119,7 @@ public double readDouble() {
11191119

11201120
@Override
11211121
public double getDouble(int roff) {
1122-
return prepRead(roff, Double.BYTES).getDouble(subOffset);
1122+
return prepGet(roff, Double.BYTES).getDouble(subOffset);
11231123
}
11241124

11251125
@Override
@@ -1242,6 +1242,17 @@ private void checkReadBounds(int index, int size) {
12421242
}
12431243
}
12441244

1245+
private BufferAccessors prepGet(int index, int size) {
1246+
checkGetBounds(index, size);
1247+
return chooseBuffer(index, size);
1248+
}
1249+
1250+
private void checkGetBounds(int index, int size) {
1251+
if (index < 0 || capacity < index + size) {
1252+
throw indexOutOfBounds(index, false);
1253+
}
1254+
}
1255+
12451256
private BufferAccessors prepWrite(int size) {
12461257
var buf = prepWrite(woff, size);
12471258
woff += size;

src/main/java/io/netty/buffer/api/memseg/MemSegBuffer.java

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -589,7 +589,7 @@ public byte readByte() {
589589

590590
@Override
591591
public byte getByte(int roff) {
592-
checkRead(roff, Byte.BYTES);
592+
checkGet(roff, Byte.BYTES);
593593
return getByteAtOffset(seg, roff);
594594
}
595595

@@ -603,7 +603,7 @@ public int readUnsignedByte() {
603603

604604
@Override
605605
public int getUnsignedByte(int roff) {
606-
checkRead(roff, Byte.BYTES);
606+
checkGet(roff, Byte.BYTES);
607607
return getByteAtOffset(seg, roff) & 0xFF;
608608
}
609609

@@ -659,7 +659,7 @@ public char readChar() {
659659

660660
@Override
661661
public char getChar(int roff) {
662-
checkRead(roff, 2);
662+
checkGet(roff, 2);
663663
return getCharAtOffset(seg, roff, order);
664664
}
665665

@@ -694,7 +694,7 @@ public short readShort() {
694694

695695
@Override
696696
public short getShort(int roff) {
697-
checkRead(roff, Short.BYTES);
697+
checkGet(roff, Short.BYTES);
698698
return getShortAtOffset(seg, roff, order);
699699
}
700700

@@ -708,7 +708,7 @@ public int readUnsignedShort() {
708708

709709
@Override
710710
public int getUnsignedShort(int roff) {
711-
checkRead(roff, Short.BYTES);
711+
checkGet(roff, Short.BYTES);
712712
return getShortAtOffset(seg, roff, order) & 0xFFFF;
713713
}
714714

@@ -770,7 +770,7 @@ public int readMedium() {
770770

771771
@Override
772772
public int getMedium(int roff) {
773-
checkRead(roff, 3);
773+
checkGet(roff, 3);
774774
return order == ByteOrder.BIG_ENDIAN?
775775
getByteAtOffset(seg, roff) << 16 |
776776
(getByteAtOffset(seg, roff + 1) & 0xFF) << 8 |
@@ -796,7 +796,7 @@ public int readUnsignedMedium() {
796796

797797
@Override
798798
public int getUnsignedMedium(int roff) {
799-
checkRead(roff, 3);
799+
checkGet(roff, 3);
800800
return order == ByteOrder.BIG_ENDIAN?
801801
(getByteAtOffset(seg, roff) << 16 |
802802
(getByteAtOffset(seg, roff + 1) & 0xFF) << 8 |
@@ -878,7 +878,7 @@ public int readInt() {
878878

879879
@Override
880880
public int getInt(int roff) {
881-
checkRead(roff, Integer.BYTES);
881+
checkGet(roff, Integer.BYTES);
882882
return getIntAtOffset(seg, roff, order);
883883
}
884884

@@ -892,7 +892,7 @@ public long readUnsignedInt() {
892892

893893
@Override
894894
public long getUnsignedInt(int roff) {
895-
checkRead(roff, Integer.BYTES);
895+
checkGet(roff, Integer.BYTES);
896896
return getIntAtOffset(seg, roff, order) & 0xFFFFFFFFL;
897897
}
898898

@@ -948,7 +948,7 @@ public float readFloat() {
948948

949949
@Override
950950
public float getFloat(int roff) {
951-
checkRead(roff, Float.BYTES);
951+
checkGet(roff, Float.BYTES);
952952
return getFloatAtOffset(seg, roff, order);
953953
}
954954

@@ -983,7 +983,7 @@ public long readLong() {
983983

984984
@Override
985985
public long getLong(int roff) {
986-
checkRead(roff, Long.BYTES);
986+
checkGet(roff, Long.BYTES);
987987
return getLongAtOffset(seg, roff, order);
988988
}
989989

@@ -1018,7 +1018,7 @@ public double readDouble() {
10181018

10191019
@Override
10201020
public double getDouble(int roff) {
1021-
checkRead(roff, Double.BYTES);
1021+
checkGet(roff, Double.BYTES);
10221022
return getDoubleAtOffset(seg, roff, order);
10231023
}
10241024

@@ -1093,6 +1093,12 @@ private void checkRead(int index, int size) {
10931093
}
10941094
}
10951095

1096+
private void checkGet(int index, int size) {
1097+
if (index < 0 || seg.byteSize() < index + size) {
1098+
throw readAccessCheckException(index);
1099+
}
1100+
}
1101+
10961102
private void checkWrite(int index, int size) {
10971103
if (index < 0 || wseg.byteSize() < index + size) {
10981104
throw writeAccessCheckException(index);

0 commit comments

Comments
 (0)