ArrowBuf.setBytes(long, ByteBuffer, int, int) does not bounds-check the source buffer
Maintainer antworten meist innerhalb von 1 Tag
@aryan9948 arbeitet bereits daran.
Seit 08.10.2026.
Bewertung
- Schwierigkeit
- 2/5
- Geschätzter Aufwand
- 1-3 Stunden
- Anfängerfreundlichkeit
- 72/100
Rechercherichtung
Beginne mit ArrowBuf.setBytes(long, ByteBuffer, int, int) und vergleiche den Pfad für direkte Buffer mit den benachbarten Overloads, die die Grenzen der Quelle validieren. Füge einen Regressionstest mit einem direkten Quellbuffer hinzu, dessen angeforderter Bereich seine Kapazität überschreitet, und führe anschließend die relevanten ArrowBuf-Tests aus. Fertig ist die Aufgabe, wenn der ungültige Bereich zurückgewiesen wird und gültige Kopiervorgänge weiterhin erfolgreich sind.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Beschreibung
Describe the bug, including details regarding any error messages, version, and platform.
ArrowBuf.setBytes(long index, ByteBuffer src, int srcIndex, int length) bound-checks only the
destination (checkIndex(index, length)), never srcIndex/length against src. On the direct
branch it takes the raw buffer address, adds srcIndex, and calls
MemoryUtil.copyMemory(srcAddress, dstAddress, length), so a request whose srcIndex + length
runs past src.capacity() reads off-heap memory beyond the source buffer and copies it into the
ArrowBuf.
The heap branch of the same method rejects the identical request (newBuf.limit(srcIndex + length)
throws), and the sibling overloads all do an unconditional isOutOfBounds check on the other
buffer: setBytes(long, byte[], int, long), setBytes(long, ArrowBuf, long, long),
getBytes(long, byte[], int, int), getBytes(long, ArrowBuf, long, int) and
NettyArrowBuf.setBytes(int, ByteBuf, int, int). This overload is the only one in the family
without one.
Reproducer (bounds checking left at its default, i.e. enabled — the missing check is on the source
side, so BoundsChecking does not cover it):
ByteBuffer backing = ByteBuffer.allocateDirect(32);
for (int i = 0; i < 32; i++) {
backing.put(i, (byte) i);
}
ByteBuffer dup = backing.duplicate();
((Buffer) dup).position(0);
((Buffer) dup).limit(16);
ByteBuffer direct = dup.slice(); // isDirect=true, capacity=16
try (BufferAllocator allocator = new RootAllocator(128);
ArrowBuf buf = allocator.buffer(16)) {
buf.setBytes(0, direct, 8, 16); // asks for src[8, 24) from a 16-byte source
byte[] actual = new byte[16];
buf.getBytes(0, actual);
System.out.println(Arrays.toString(actual));
}
Output:
[8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23]
The last eight bytes (16..23) are outside the source buffer. The same call with a heap
ByteBuffer raises IllegalArgumentException: newLimit > capacity: (24 > 16), and
buf.setBytes(0, new byte[16], 8, 16) raises IndexOutOfBoundsException.
This overload backs set/setSafe(int, ByteBuffer, int, int) on BaseVariableWidthVector,
BaseLargeVariableWidthVector, BaseVariableWidthViewVector and BaseFixedWidthVector, which
pass start/length straight through, so the adjacent memory lands in vector data that is then
returned to callers or written out over IPC.
Component(s)
Java
- Vorherrschende Sprache
- Java
- Sterne
- 98
- Forks
- 160
- Ø Merge
- 5 T. 6 Std.
- Gemergte PRs (30 T.)
- 27
Entwicklungsumgebung
- Enthält ein Dockerfile oder eine Docker-Compose-Datei
- Hat eine Pull-Request-Vorlage
- Beitragsleitfaden lesen
Erste Schritte
- Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
- Forken Sie das Repository und arbeiten Sie in einem Branch.
- Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.
Mehr aus apache/arrow-java
-
Flight SQL JDBC parses boolean properties case-sensitively, silently disabling TLS for useEncryption=TRUEEvtl. vergeben @Arawoof06 hat das vor 3 Tagen übernommen. Offen
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 79/100
apache/arrow-java#1357 ·
Maintainer antworten meist innerhalb von 1 Tag
-
ArrowFlightJdbcArray.getArray(index, count) can read past the end of the array sliceEvtl. vergeben @Arawoof06 hat das vor 88 Tagen übernommen. Offen
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 78/100
apache/arrow-java#1236 ·
Maintainer antworten meist innerhalb von 1 Tag
-
[Java][JDBC] ClobConsumer writes past VarCharVector data buffer for large CLOBsEvtl. vergeben @Arawoof06 hat das vor 93 Tagen übernommen. Offen
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 78/100
apache/arrow-java#1230 ·
Maintainer antworten meist innerhalb von 1 Tag
-
[Java] DictionaryEncoder doesn't crash when decoding index outside of DictionaryEvtl. vergeben @jakobhok-neo4j hat das vor 150 Tagen übernommen. OffenType: bug
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 74/100
apache/arrow-java#1158 ·
Maintainer antworten meist innerhalb von 1 Tag
-
Type: enhancement
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 76/100
apache/arrow-java#1100 ·
Maintainer antworten meist innerhalb von 1 Tag
Alle Issues in apache/arrow-java
Ähnliche Issues
-
bug
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 74/100
refinedmods/refinedstorage2#1421 ·
-
StepExamBenchmarkTest runs a loop and prints a timing but asserts nothingEvtl. vergeben Ein verknüpfter Pull Request ist offen oder bereits gemergt. Offenjules
Schwierigkeit 1/5 Unter einer Stunde Anfängerfreundlichkeit 82/100
open-learning-exchange/myplanet#18199 · 1 Kommentar ·
Maintainer antworten meist innerhalb von 4 Tagen
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 65/100
Maintainer antworten meist innerhalb von 1 Tag
-
Scheme-less stream URLs throw NullPointerException instead of URISyntaxExceptionEvtl. vergeben @blihio hat das heute übernommen. Offen
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 82/100
pedroSG94/RootEncoder#2218 ·
Maintainer antworten meist innerhalb von 3 Tagen
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 68/100
apache/rocketmq-dashboard#6872 ·
Maintainer antworten meist innerhalb von 3 Tagen