Byte-array elements leak in `FromSchemaByteArray()`

Aberta Para iniciantes
#1,205 0 comentários 0 reações 0 responsáveis Ver no GitHub

Ninguém assumiu esta issue ainda.

Avaliação

Dificuldade
2/5
Tempo estimado
1-3 horas
Facilidade para iniciantes
85/100
Tipo de issue
Bug
Clareza
Claramente especificada
Status de atividade
Pouca atividade
Stack de tecnologia
cpp, java
Domínio
backend

Direção de pesquisa

Comece em dataset/src/main/cpp/jni_util.cc, em FromSchemaByteArray(), e inspecione o fluxo de GetByteArrayElements, ReadSchema e ReleaseByteArrayElements. Verifique se a liberação também ocorre quando o parsing falha e, em seguida, exercite o caminho de um schema malformado ou incompatível por meio de createDataset(); está concluído quando os elementos do array JNI adquiridos são liberados nos caminhos de sucesso e de erro.

Escrita pelo modelo de indexação a partir do texto da issue.

Descrição

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.

Linguagem predominante
Java
Estrelas
95
Forks
154
Merge médio
2d 10h
PRs com merge (30d)
11

Guia de contribuição

Abrir o guia de contribuição

Primeiros passos

  1. Leia a issue inteira e depois o guia de contribuição do projeto.
  2. Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
  3. Faça um fork do repositório e trabalhe em uma branch.
  4. Abra um pull request que referencie o número da issue.

Mais de apache/arrow-java

Todas as issues de apache/arrow-java

Issues semelhantes

Mais issues de Java

Receba novas issues na sua caixa de entrada

Um resumo curto de issues do GitHub para quem está começando.