Skip to content

Commit ad67e19

Browse files
committed
Move bound checks for Bytes implementation out of constructors
Signed-off-by: Luis Pinto <[email protected]>
1 parent b9c6b05 commit ad67e19

File tree

11 files changed

+78
-142
lines changed

11 files changed

+78
-142
lines changed

bytes/src/main/java/org/apache/tuweni/v2/bytes/ArrayWrappingBytes.java

Lines changed: 7 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
import static org.apache.tuweni.v2.bytes.Utils.checkArgument;
66
import static org.apache.tuweni.v2.bytes.Utils.checkElementIndex;
7+
import static org.apache.tuweni.v2.bytes.Utils.checkLength;
78

89
import java.nio.ByteBuffer;
910
import java.security.MessageDigest;
@@ -16,23 +17,8 @@ class ArrayWrappingBytes extends Bytes {
1617
protected final byte[] bytes;
1718
protected final int offset;
1819

19-
ArrayWrappingBytes(byte[] bytes) {
20-
this(bytes, 0, bytes.length);
21-
}
22-
2320
ArrayWrappingBytes(byte[] bytes, int offset, int length) {
2421
super(length);
25-
checkArgument(length >= 0, "Invalid negative length");
26-
if (bytes.length > 0) {
27-
checkElementIndex(offset, bytes.length);
28-
}
29-
checkArgument(
30-
offset + length <= bytes.length,
31-
"Provided length %s is too big: the value has only %s bytes from offset %s",
32-
length,
33-
bytes.length - offset,
34-
offset);
35-
3622
this.bytes = bytes;
3723
this.offset = offset;
3824
}
@@ -50,18 +36,16 @@ public Bytes slice(int i, int length) {
5036
if (i == 0 && length == size()) {
5137
return this;
5238
}
39+
5340
if (length == 0) {
5441
return EMPTY;
5542
}
5643

57-
checkElementIndex(i, size());
58-
checkArgument(
59-
i + length <= size(),
60-
"Provided length %s is too big: the value has size %s and has only %s bytes from %s",
61-
length,
62-
size(),
63-
size() - i,
64-
i);
44+
checkArgument(length > 0, "Invalid negative length");
45+
if (bytes.length > 0) {
46+
checkElementIndex(offset + i, bytes.length);
47+
}
48+
checkLength(bytes.length, offset + i, length);
6549

6650
return new ArrayWrappingBytes(bytes, offset + i, length);
6751
}

bytes/src/main/java/org/apache/tuweni/v2/bytes/BufferWrappingBytes.java

Lines changed: 3 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,12 @@
22
// SPDX-License-Identifier: Apache-2.0
33
package org.apache.tuweni.v2.bytes;
44

5-
import static org.apache.tuweni.v2.bytes.Utils.checkArgument;
65
import static org.apache.tuweni.v2.bytes.Utils.checkElementIndex;
6+
import static org.apache.tuweni.v2.bytes.Utils.checkLength;
77

88
import io.vertx.core.buffer.Buffer;
99

1010
class BufferWrappingBytes extends Bytes {
11-
1211
protected final Buffer buffer;
1312

1413
BufferWrappingBytes(Buffer buffer) {
@@ -18,18 +17,7 @@ class BufferWrappingBytes extends Bytes {
1817

1918
BufferWrappingBytes(Buffer buffer, int offset, int length) {
2019
super(length);
21-
checkArgument(length >= 0, "Invalid negative length");
22-
int bufferLength = buffer.length();
23-
checkElementIndex(offset, bufferLength + 1);
24-
checkArgument(
25-
offset + length <= bufferLength,
26-
"Provided length %s is too big: the buffer has size %s and has only %s bytes from %s",
27-
length,
28-
bufferLength,
29-
bufferLength - offset,
30-
offset);
31-
32-
if (offset == 0 && length == bufferLength) {
20+
if (offset == 0 && length == buffer.length()) {
3321
this.buffer = buffer;
3422
} else {
3523
this.buffer = buffer.slice(offset, offset + length);
@@ -62,13 +50,7 @@ public Bytes slice(int i, int length) {
6250
}
6351

6452
checkElementIndex(i, size);
65-
checkArgument(
66-
i + length <= size,
67-
"Provided length %s is too big: the value has size %s and has only %s bytes from %s",
68-
length,
69-
size,
70-
size - i,
71-
i);
53+
checkLength(size, i, length);
7254

7355
return new BufferWrappingBytes(buffer.slice(i, i + length));
7456
}

bytes/src/main/java/org/apache/tuweni/v2/bytes/ByteBufWrappingBytes.java

Lines changed: 3 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22
// SPDX-License-Identifier: Apache-2.0
33
package org.apache.tuweni.v2.bytes;
44

5-
import static org.apache.tuweni.v2.bytes.Utils.checkArgument;
65
import static org.apache.tuweni.v2.bytes.Utils.checkElementIndex;
6+
import static org.apache.tuweni.v2.bytes.Utils.checkLength;
77

88
import io.netty.buffer.ByteBuf;
99
import io.vertx.core.buffer.Buffer;
@@ -19,18 +19,7 @@ class ByteBufWrappingBytes extends Bytes {
1919

2020
ByteBufWrappingBytes(ByteBuf byteBuf, int offset, int length) {
2121
super(length);
22-
checkArgument(length >= 0, "Invalid negative length");
23-
int bufferLength = byteBuf.capacity();
24-
checkElementIndex(offset, bufferLength + 1);
25-
checkArgument(
26-
offset + length <= bufferLength,
27-
"Provided length %s is too big: the buffer has size %s and has only %s bytes from %s",
28-
length,
29-
bufferLength,
30-
bufferLength - offset,
31-
offset);
32-
33-
if (offset == 0 && length == bufferLength) {
22+
if (offset == 0 && length == byteBuf.capacity()) {
3423
this.byteBuf = byteBuf;
3524
} else {
3625
this.byteBuf = byteBuf.slice(offset, length);
@@ -68,13 +57,7 @@ public Bytes slice(int i, int length) {
6857
}
6958

7059
checkElementIndex(i, size);
71-
checkArgument(
72-
i + length <= size,
73-
"Provided length %s is too big: the value has size %s and has only %s bytes from %s",
74-
length,
75-
size,
76-
size - i,
77-
i);
60+
checkLength(size, i, length);
7861

7962
return new ByteBufWrappingBytes(byteBuf.slice(i, length));
8063
}

bytes/src/main/java/org/apache/tuweni/v2/bytes/ByteBufferWrappingBytes.java

Lines changed: 7 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
import static org.apache.tuweni.v2.bytes.Utils.checkArgument;
66
import static org.apache.tuweni.v2.bytes.Utils.checkElementIndex;
7+
import static org.apache.tuweni.v2.bytes.Utils.checkLength;
78

89
import java.nio.ByteBuffer;
910

@@ -18,18 +19,6 @@ class ByteBufferWrappingBytes extends Bytes {
1819

1920
ByteBufferWrappingBytes(ByteBuffer byteBuffer, int offset, int length) {
2021
super(length);
21-
checkArgument(length >= 0, "Invalid negative length");
22-
int bufferLength = byteBuffer.capacity();
23-
if (bufferLength > 0) {
24-
checkElementIndex(offset, bufferLength);
25-
}
26-
checkArgument(
27-
offset + length <= bufferLength,
28-
"Provided length %s is too big: the value has only %s bytes from offset %s",
29-
length,
30-
bufferLength - offset,
31-
offset);
32-
3322
this.byteBuffer = byteBuffer;
3423
this.offset = offset;
3524
}
@@ -58,14 +47,12 @@ public Bytes slice(int i, int length) {
5847
return Bytes.EMPTY;
5948
}
6049

61-
checkElementIndex(i, size());
62-
checkArgument(
63-
i + length <= size(),
64-
"Provided length %s is too big: the value has size %s and has only %s bytes from %s",
65-
length,
66-
size(),
67-
size() - i,
68-
i);
50+
checkArgument(length >= 0, "Invalid negative length");
51+
int bufferLength = byteBuffer.capacity();
52+
if (bufferLength > 0) {
53+
checkElementIndex(offset + i, bufferLength);
54+
}
55+
checkLength(bufferLength, offset + i, length);
6956

7057
return new ByteBufferWrappingBytes(byteBuffer, offset + i, length);
7158
}

bytes/src/main/java/org/apache/tuweni/v2/bytes/Bytes.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import static java.nio.ByteOrder.BIG_ENDIAN;
77
import static org.apache.tuweni.v2.bytes.Utils.checkArgument;
88
import static org.apache.tuweni.v2.bytes.Utils.checkElementIndex;
9+
import static org.apache.tuweni.v2.bytes.Utils.checkLength;
910
import static org.apache.tuweni.v2.bytes.Utils.checkNotNull;
1011

1112
import java.io.IOException;
@@ -75,6 +76,11 @@ public static Bytes wrap(byte[] value) {
7576
*/
7677
public static Bytes wrap(byte[] value, int offset, int length) {
7778
checkNotNull(value);
79+
checkArgument(length >= 0, "Invalid negative length");
80+
if (value.length > 0) {
81+
checkElementIndex(offset, value.length);
82+
}
83+
checkLength(value.length, offset, length);
7884
return new ArrayWrappingBytes(value, offset, length);
7985
}
8086

@@ -141,6 +147,10 @@ public static Bytes wrapBuffer(Buffer buffer, int offset, int size) {
141147
if (size == 0) {
142148
return EMPTY;
143149
}
150+
checkArgument(size >= 0, "Invalid negative length");
151+
int bufferLength = buffer.length();
152+
checkElementIndex(offset, bufferLength + 1);
153+
checkLength(bufferLength, offset, size);
144154
return new BufferWrappingBytes(buffer, offset, size);
145155
}
146156

@@ -179,6 +189,11 @@ public static Bytes wrapByteBuf(ByteBuf byteBuf, int offset, int size) {
179189
if (size == 0) {
180190
return EMPTY;
181191
}
192+
checkArgument(size >= 0, "Invalid negative length");
193+
int bufferLength = byteBuf.capacity();
194+
checkElementIndex(offset, bufferLength + 1);
195+
checkLength(bufferLength, offset, size);
196+
182197
return new ByteBufWrappingBytes(byteBuf, offset, size);
183198
}
184199

@@ -217,6 +232,12 @@ public static Bytes wrapByteBuffer(ByteBuffer byteBuffer, int offset, int size)
217232
if (size == 0) {
218233
return EMPTY;
219234
}
235+
checkArgument(size >= 0, "Invalid negative length");
236+
int bufferLength = byteBuffer.capacity();
237+
if (bufferLength > 0) {
238+
checkElementIndex(offset, bufferLength);
239+
}
240+
checkLength(bufferLength, offset, size);
220241
return new ByteBufferWrappingBytes(byteBuffer, offset, size);
221242
}
222243

bytes/src/main/java/org/apache/tuweni/v2/bytes/Bytes32.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
package org.apache.tuweni.v2.bytes;
44

55
import static org.apache.tuweni.v2.bytes.Utils.checkArgument;
6+
import static org.apache.tuweni.v2.bytes.Utils.checkElementIndex;
67
import static org.apache.tuweni.v2.bytes.Utils.checkNotNull;
78

89
import java.security.SecureRandom;
@@ -72,6 +73,9 @@ public static Bytes32 wrap(byte[] bytes, int offset) {
7273

7374
public static Bytes fromArray(byte[] bytes, int offset) {
7475
checkNotNull(bytes);
76+
if (bytes.length > 0) {
77+
checkElementIndex(offset, bytes.length);
78+
}
7579
checkLength(bytes, offset);
7680
return new ArrayWrappingBytes(bytes, offset, bytes.length);
7781
}

bytes/src/main/java/org/apache/tuweni/v2/bytes/Bytes48.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
package org.apache.tuweni.v2.bytes;
44

55
import static org.apache.tuweni.v2.bytes.Utils.checkArgument;
6+
import static org.apache.tuweni.v2.bytes.Utils.checkElementIndex;
67
import static org.apache.tuweni.v2.bytes.Utils.checkNotNull;
78

89
import java.security.SecureRandom;
@@ -73,6 +74,9 @@ public static Bytes48 wrap(byte[] bytes, int offset) {
7374

7475
public static Bytes fromArray(byte[] bytes, int offset) {
7576
checkNotNull(bytes);
77+
if (bytes.length > 0) {
78+
checkElementIndex(offset, bytes.length);
79+
}
7680
checkLength(bytes, offset);
7781
return new ArrayWrappingBytes(bytes, offset, bytes.length);
7882
}

bytes/src/main/java/org/apache/tuweni/v2/bytes/ConcatenatedBytes.java

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22
// SPDX-License-Identifier: Apache-2.0
33
package org.apache.tuweni.v2.bytes;
44

5-
import static org.apache.tuweni.v2.bytes.Utils.checkArgument;
65
import static org.apache.tuweni.v2.bytes.Utils.checkElementIndex;
6+
import static org.apache.tuweni.v2.bytes.Utils.checkLength;
77

88
import java.security.MessageDigest;
99
import java.util.List;
@@ -139,13 +139,7 @@ public Bytes slice(int offset, int length) {
139139
}
140140

141141
checkElementIndex(offset, size());
142-
checkArgument(
143-
(offset + length) <= size(),
144-
"Provided length %s is too large: the value has size %s and has only %s bytes from %s",
145-
length,
146-
size(),
147-
size() - offset,
148-
offset);
142+
checkLength(size(), offset, length);
149143

150144
int startIndex = 0;
151145
for (int i = 0; i < values.length; i++) {

0 commit comments

Comments
 (0)