Skip to content

Commit 25f8798

Browse files
committed
Check the byte order of input buffers when serializing/deserializing geometry bounds
1 parent 2cbef4a commit 25f8798

4 files changed

Lines changed: 14 additions & 18 deletions

File tree

api/src/main/java/org/apache/iceberg/geospatial/BoundingBox.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,8 @@ public static BoundingBox fromByteBuffers(ByteBuffer min, ByteBuffer max) {
5151
* @return a BoundingBox instance
5252
*/
5353
public static BoundingBox fromByteBuffer(ByteBuffer buffer) {
54+
Preconditions.checkArgument(
55+
buffer.order() == ByteOrder.LITTLE_ENDIAN, "Invalid byte order: big endian");
5456
ByteBuffer tmp = buffer.duplicate();
5557
tmp.order(ByteOrder.LITTLE_ENDIAN);
5658

api/src/main/java/org/apache/iceberg/geospatial/GeospatialBound.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,8 @@ public class GeospatialBound {
6363
* @throws IllegalArgumentException if the buffer has an invalid size
6464
*/
6565
public static GeospatialBound fromByteBuffer(ByteBuffer buffer) {
66+
Preconditions.checkArgument(
67+
buffer.order() == ByteOrder.LITTLE_ENDIAN, "Invalid byte order: big endian");
6668
ByteBuffer tmp = buffer.duplicate();
6769
tmp.order(ByteOrder.LITTLE_ENDIAN);
6870
int size = tmp.remaining();
@@ -146,7 +148,7 @@ public ByteBuffer toByteBuffer() {
146148
* @throws IllegalArgumentException if the byte array has an invalid length
147149
*/
148150
public static GeospatialBound fromByteArray(byte[] bytes) {
149-
return fromByteBuffer(ByteBuffer.wrap(bytes));
151+
return fromByteBuffer(ByteBuffer.wrap(bytes).order(ByteOrder.LITTLE_ENDIAN));
150152
}
151153

152154
/**

api/src/test/java/org/apache/iceberg/geospatial/TestBoundingBox.java

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -104,12 +104,8 @@ public void testFromByteBuffer() {
104104
GeospatialBound max = GeospatialBound.createXY(3.0, 4.0);
105105
BoundingBox box = new BoundingBox(min, max);
106106
ByteBuffer buffer = box.toByteBuffer();
107-
for (ByteOrder byteOrder : new ByteOrder[] {ByteOrder.BIG_ENDIAN, ByteOrder.LITTLE_ENDIAN}) {
108-
buffer.order(byteOrder);
109-
assertThat(BoundingBox.fromByteBuffer(buffer)).isEqualTo(box);
110-
assertThat(buffer.position()).isEqualTo(0);
111-
assertThat(buffer.order()).isEqualTo(byteOrder);
112-
}
107+
assertThat(BoundingBox.fromByteBuffer(buffer)).isEqualTo(box);
108+
assertThat(buffer.position()).isEqualTo(0);
113109
}
114110

115111
@Test

api/src/test/java/org/apache/iceberg/geospatial/TestGeospatialBound.java

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -213,17 +213,13 @@ public void testFromByteBuffer() {
213213
0, 0, 0, 0, 0, 0, 36, 64, // 10.0 in little-endian IEEE 754
214214
0, 0, 0, 0, 0, 0, 42, 64 // 13.0 in little-endian IEEE 754
215215
};
216-
ByteBuffer xyBuffer = ByteBuffer.wrap(xyBytes);
217-
for (ByteOrder endianness : new ByteOrder[] {ByteOrder.BIG_ENDIAN, ByteOrder.LITTLE_ENDIAN}) {
218-
xyBuffer.order(endianness);
219-
GeospatialBound xy = GeospatialBound.fromByteBuffer(xyBuffer);
220-
assertThat(xy.x()).isEqualTo(10.0);
221-
assertThat(xy.y()).isEqualTo(13.0);
222-
assertThat(xy.hasZ()).isFalse();
223-
assertThat(xy.hasM()).isFalse();
224-
assertThat(xyBuffer.position()).isEqualTo(0);
225-
assertThat(xyBuffer.order()).isEqualTo(endianness);
226-
}
216+
ByteBuffer xyBuffer = ByteBuffer.wrap(xyBytes).order(ByteOrder.LITTLE_ENDIAN);
217+
GeospatialBound xy = GeospatialBound.fromByteBuffer(xyBuffer);
218+
assertThat(xy.x()).isEqualTo(10.0);
219+
assertThat(xy.y()).isEqualTo(13.0);
220+
assertThat(xy.hasZ()).isFalse();
221+
assertThat(xy.hasM()).isFalse();
222+
assertThat(xyBuffer.position()).isEqualTo(0);
227223
}
228224

229225
private GeospatialBound roundTripSerDe(GeospatialBound original) {

0 commit comments

Comments
 (0)