Skip to content

Commit 9f64b77

Browse files
committed
GH-1205: Fix byte-array element leak in FromSchemaByteArray by releasing elements via RAII guard
1 parent 21b6a05 commit 9f64b77

1 file changed

Lines changed: 8 additions & 4 deletions

File tree

dataset/src/main/cpp/jni_util.cc

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -352,13 +352,17 @@ arrow::Result<std::shared_ptr<arrow::Schema>> FromSchemaByteArray(
352352
arrow::ipc::DictionaryMemo in_memo;
353353
int schemaBytes_len = env->GetArrayLength(schemaBytes);
354354
jbyte* schemaBytes_data = env->GetByteArrayElements(schemaBytes, nullptr);
355+
// Ensure the pinned/copied Java array elements are always released, even when
356+
// schema parsing fails and an error Result is returned early below.
357+
auto release_elements = [&](jbyte* data) {
358+
env->ReleaseByteArrayElements(schemaBytes, data, JNI_ABORT);
359+
};
360+
std::unique_ptr<jbyte, decltype(release_elements)> elements_guard(schemaBytes_data,
361+
release_elements);
355362
auto serialized_schema = std::make_shared<arrow::Buffer>(
356363
reinterpret_cast<uint8_t*>(schemaBytes_data), schemaBytes_len);
357364
arrow::io::BufferReader buf_reader(serialized_schema);
358-
ARROW_ASSIGN_OR_RAISE(std::shared_ptr<arrow::Schema> schema,
359-
arrow::ipc::ReadSchema(&buf_reader, &in_memo))
360-
env->ReleaseByteArrayElements(schemaBytes, schemaBytes_data, JNI_ABORT);
361-
return schema;
365+
return arrow::ipc::ReadSchema(&buf_reader, &in_memo);
362366
}
363367
arrow::Status ExportRecordBatch(JNIEnv* env, const std::shared_ptr<RecordBatch>& batch,
364368
jlong struct_array) {

0 commit comments

Comments
 (0)