Byte-array elements leak in `FromSchemaByteArray()`

Ouverte Adaptée aux débutants
#1,205 0 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

Évaluation

Difficulté
2/5
Temps estimé
1-3 heures
Accessibilité débutants
85/100
Type d'issue
Bug
Clarté
Clairement spécifiée
Activité
Calme
Stack technique
cpp, java
Domaine
backend

Piste de recherche

Commencez dans dataset/src/main/cpp/jni_util.cc, au niveau de FromSchemaByteArray(), et inspectez le flux de GetByteArrayElements, ReadSchema et ReleaseByteArrayElements. Vérifiez que la libération a également lieu lorsque l’analyse échoue, puis exécutez le chemin d’un schéma malformé ou incompatible via createDataset() ; c’est terminé lorsque les éléments de tableau JNI acquis sont libérés sur les chemins de succès comme d’erreur.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Description

Type: bug
Describe the bug, including details regarding any error messages, version, and platform.

I found a possible JNI array leak in FromSchemaByteArray() when the serialized schema cannot be parsed.

File: dataset/src/main/cpp/jni_util.cc

Function: FromSchemaByteArray

Relevant code:

jbyte* schemaBytes_data =
    env->GetByteArrayElements(schemaBytes, nullptr);
auto serialized_schema = std::make_shared<arrow::Buffer>(
    reinterpret_cast<uint8_t*>(schemaBytes_data),
    schemaBytes_len);
arrow::io::BufferReader buf_reader(serialized_schema);

ARROW_ASSIGN_OR_RAISE(
    std::shared_ptr<arrow::Schema> schema,
    arrow::ipc::ReadSchema(&buf_reader, &in_memo))

env->ReleaseByteArrayElements(
    schemaBytes, schemaBytes_data, JNI_ABORT);
return schema;

GetByteArrayElements() returns a pointer that must be paired with
ReleaseByteArrayElements().

ARROW_ASSIGN_OR_RAISE returns immediately when ReadSchema() returns an
error. On that path, the release below the macro is skipped, so the acquired
array elements remain unreleased:

GetByteArrayElements succeeds
  -> ReadSchema returns an error
  -> ARROW_ASSIGN_OR_RAISE returns
  -> ReleaseByteArrayElements is skipped

The function is used by the public native createDataset() method:

schema = JniGetOrThrow(
    FromSchemaByteArray(env, schema_bytes));

Malformed, corrupted, or incompatible serialized schema bytes can therefore
reach this path. Repeated failed calls can retain copied array buffers or keep
Java arrays pinned, depending on the JVM implementation.

Suggested fix: release the elements before propagating the parse result, for
example:

auto schema_result =
    arrow::ipc::ReadSchema(&buf_reader, &in_memo);

env->ReleaseByteArrayElements(
    schemaBytes, schemaBytes_data, JNI_ABORT);

return schema_result;

An RAII guard for schemaBytes_data would also ensure release if additional
early returns are introduced later.

Langage dominant
Java
Étoiles
95
Forks
154
Merge moyen
2 j 16 h
PR mergées (30 j)
9

Guide de contribution

Ouvrir le guide de contribution

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Autres issues de apache/arrow-java

Toutes les issues de apache/arrow-java

Issues similaires

Plus d'issues Java

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.