ArrowBuf.setBytes(long, ByteBuffer, int, int) does not bounds-check the source buffer
Les mainteneurs répondent en général sous 1 jour
@aryan9948 y travaille déjà.
Depuis le 8/10/2026.
Évaluation
- Difficulté
- 2/5
- Temps estimé
- 1-3 heures
- Accessibilité débutants
- 72/100
Piste de recherche
Commencez par ArrowBuf.setBytes(long, ByteBuffer, int, int) et comparez le chemin des buffers directs aux surcharges voisines qui valident les limites de la source. Ajoutez un test de régression utilisant un buffer source direct dont la plage demandée dépasse la capacité, puis exécutez les tests ArrowBuf pertinents. Le travail est terminé lorsque la plage invalide est rejetée et que les copies valides passent toujours.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
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
- Langage dominant
- Java
- Étoiles
- 98
- Forks
- 160
- Merge moyen
- 5 j 6 h
- PR mergées (30 j)
- 27
Préparer son environnement
- Fournit un Dockerfile ou un fichier Docker Compose
- Propose un modèle de pull request
- Lire le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Autres issues de apache/arrow-java
-
Flight SQL JDBC parses boolean properties case-sensitively, silently disabling TLS for useEncryption=TRUEPeut-être pris @Arawoof06 l’a pris il y a 2 jours. Ouverte
Difficulté 2/5 1-3 heures Accessibilité débutants 79/100
apache/arrow-java#1357 ·
Les mainteneurs répondent en général sous 1 jour
-
ArrowFlightJdbcArray.getArray(index, count) can read past the end of the array slicePeut-être pris @Arawoof06 l’a pris il y a 87 jours. Ouverte
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
apache/arrow-java#1236 ·
Les mainteneurs répondent en général sous 1 jour
-
[Java][JDBC] ClobConsumer writes past VarCharVector data buffer for large CLOBsPeut-être pris @Arawoof06 l’a pris il y a 92 jours. Ouverte
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
apache/arrow-java#1230 ·
Les mainteneurs répondent en général sous 1 jour
-
[Java] DictionaryEncoder doesn't crash when decoding index outside of DictionaryPeut-être pris @jakobhok-neo4j l’a pris il y a 149 jours. OuverteType: bug
Difficulté 2/5 1-3 heures Accessibilité débutants 74/100
apache/arrow-java#1158 ·
Les mainteneurs répondent en général sous 1 jour
-
Type: enhancement
Difficulté 2/5 1-3 heures Accessibilité débutants 76/100
apache/arrow-java#1100 ·
Les mainteneurs répondent en général sous 1 jour
Toutes les issues de apache/arrow-java
Issues similaires
-
area/plugin good first issue
Difficulté 2/5 1-3 heures Accessibilité débutants 85/100
kestra-io/plugin-soda#137 ·
-
area/plugin good first issue
Difficulté 2/5 1-3 heures Accessibilité débutants 82/100
kestra-io/plugin-aws#816 ·
Les mainteneurs répondent en général sous 2 jours
-
area/plugin good first issue
Difficulté 2/5 1-3 heures Accessibilité débutants 88/100
kestra-io/plugin-kestra#200 ·
Les mainteneurs répondent en général sous 1 jour
-
bug untriaged
Difficulté 1/5 Moins d'une heure Accessibilité débutants 92/100
opensearch-project/search-relevance#618 ·
Les mainteneurs répondent en général sous 3 jours
-
Difficulté 2/5 1-3 heures Accessibilité débutants 72/100
apache/rocketmq-dashboard#6716 ·
Les mainteneurs répondent en général sous 3 jours