Skip to content

Commit ccb9c16

Browse files
Check bounds on index in setPosition()
1 parent 0919738 commit ccb9c16

File tree

7 files changed

+40
-0
lines changed

7 files changed

+40
-0
lines changed

adapter/avro/src/main/java/org/apache/arrow/adapter/avro/producers/AvroFixedSizeListProducer.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,9 @@ public void skipNull() {
6060

6161
@Override
6262
public void setPosition(int index) {
63+
if (index < 0 || index > vector.getValueCount()) {
64+
throw new IllegalArgumentException("Index out of bounds");
65+
}
6366
int delegateOffset = vector.getOffsetBuffer().getInt(index * (long) Integer.BYTES);
6467
delegate.setPosition(delegateOffset);
6568
super.setPosition(index);

adapter/avro/src/main/java/org/apache/arrow/adapter/avro/producers/AvroListProducer.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,9 @@ public void produce(Encoder encoder) throws IOException {
5757

5858
@Override
5959
public void setPosition(int index) {
60+
if (index < 0 || index > vector.getValueCount()) {
61+
throw new IllegalArgumentException("Index out of bounds");
62+
}
6063
int delegateOffset = vector.getOffsetBuffer().getInt(index * (long) Integer.BYTES);
6164
delegate.setPosition(delegateOffset);
6265
super.setPosition(index);

adapter/avro/src/main/java/org/apache/arrow/adapter/avro/producers/AvroMapProducer.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,9 @@ public void produce(Encoder encoder) throws IOException {
5555

5656
@Override
5757
public void setPosition(int index) {
58+
if (index < 0 || index > vector.getValueCount()) {
59+
throw new IllegalArgumentException("Index out of bounds");
60+
}
5861
int delegateOffset = vector.getOffsetBuffer().getInt(index * (long) Integer.BYTES);
5962
delegate.setPosition(delegateOffset);
6063
super.setPosition(index);

adapter/avro/src/main/java/org/apache/arrow/adapter/avro/producers/AvroNullableProducer.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,9 @@ public void skipNull() {
5858

5959
@Override
6060
public void setPosition(int index) {
61+
if (index < 0 || index > vector.getValueCount()) {
62+
throw new IllegalArgumentException("Index out of bounds");
63+
}
6164
delegate.setPosition(index);
6265
super.setPosition(index);
6366
}

adapter/avro/src/main/java/org/apache/arrow/adapter/avro/producers/AvroStructProducer.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,9 @@ public void skipNull() {
5555

5656
@Override
5757
public void setPosition(int index) {
58+
if (index < 0 || index > vector.getValueCount()) {
59+
throw new IllegalArgumentException("Index out of bounds: " + index);
60+
}
5861
for (Producer<?> delegate : delegates) {
5962
delegate.setPosition(index);
6063
}

adapter/avro/src/main/java/org/apache/arrow/adapter/avro/producers/BaseAvroProducer.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,10 @@ public void skipNull() {
4444

4545
@Override
4646
public void setPosition(int index) {
47+
// currentIndex == value is a valid state, no more values will be produced
48+
if (index < 0 || index > vector.getValueCount()) {
49+
throw new IllegalArgumentException("Index out of bounds");
50+
}
4751
currentIndex = index;
4852
}
4953

adapter/avro/src/test/java/org/apache/arrow/adapter/avro/ArrowToAvroDataTest.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2294,6 +2294,9 @@ public void testWriteMap() throws Exception {
22942294
root.setRowCount(rowCount);
22952295
root.allocateNew();
22962296

2297+
// Total number of entries that will be writen to each vector
2298+
int entryCount = 5 * 4 * 3;
2299+
22972300
// Set test data for intList
22982301
BaseWriter.MapWriter writer = intMapVector.getWriter();
22992302
for (int i = 0; i < rowCount; i++) {
@@ -2307,6 +2310,9 @@ public void testWriteMap() throws Exception {
23072310
writer.endMap();
23082311
}
23092312

2313+
// Update count for data vector (map writer does not do this)
2314+
intMapVector.getDataVector().setValueCount(entryCount);
2315+
23102316
// Set test data for stringList
23112317
BaseWriter.MapWriter stringWriter = stringMapVector.getWriter();
23122318
for (int i = 0; i < rowCount; i++) {
@@ -2320,6 +2326,9 @@ public void testWriteMap() throws Exception {
23202326
stringWriter.endMap();
23212327
}
23222328

2329+
// Update count for data vector (map writer does not do this)
2330+
stringMapVector.getDataVector().setValueCount(entryCount);
2331+
23232332
// Set test data for dateList
23242333
BaseWriter.MapWriter dateWriter = dateMapVector.getWriter();
23252334
for (int i = 0; i < rowCount; i++) {
@@ -2333,6 +2342,9 @@ public void testWriteMap() throws Exception {
23332342
dateWriter.endMap();
23342343
}
23352344

2345+
// Update count for data vector (map writer does not do this)
2346+
dateMapVector.getDataVector().setValueCount(entryCount);
2347+
23362348
File dataFile = new File(TMP, "testWriteMap.avro");
23372349

23382350
// Write an AVRO block using the producer classes
@@ -2431,6 +2443,9 @@ public void testWriteNullableMap() throws Exception {
24312443
writer.endEntry();
24322444
writer.endMap();
24332445

2446+
// Update count for data vector (map writer does not do this)
2447+
nullEntriesVector.getDataVector().setValueCount(3);
2448+
24342449
// Set test data for stringList
24352450
BaseWriter.MapWriter nullMapWriter = nullMapVector.getWriter();
24362451
nullMapWriter.writeNull();
@@ -2448,6 +2463,9 @@ public void testWriteNullableMap() throws Exception {
24482463
nullMapWriter.endEntry();
24492464
nullMapWriter.endMap();
24502465

2466+
// Update count for data vector (map writer does not do this)
2467+
nullMapVector.getDataVector().setValueCount(2);
2468+
24512469
// Set test data for dateList
24522470
BaseWriter.MapWriter nullBothWriter = nullBothVector.getWriter();
24532471
nullBothWriter.writeNull();
@@ -2465,6 +2483,9 @@ public void testWriteNullableMap() throws Exception {
24652483
nullBothWriter.endEntry();
24662484
nullBothWriter.endMap();
24672485

2486+
// Update count for data vector (map writer does not do this)
2487+
nullBothVector.getDataVector().setValueCount(2);
2488+
24682489
File dataFile = new File(TMP, "testWriteNullableMap.avro");
24692490

24702491
// Write an AVRO block using the producer classes

0 commit comments

Comments
 (0)