From 9f64b779d82c5713db1b10b3827319c97735ef40 Mon Sep 17 00:00:00 2001 From: PG1204 Date: Fri, 24 Jul 2026 10:23:45 -0700 Subject: [PATCH] GH-1205: Fix byte-array element leak in FromSchemaByteArray by releasing elements via RAII guard --- dataset/src/main/cpp/jni_util.cc | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/dataset/src/main/cpp/jni_util.cc b/dataset/src/main/cpp/jni_util.cc index 35bfb328f0..23c9db06c5 100644 --- a/dataset/src/main/cpp/jni_util.cc +++ b/dataset/src/main/cpp/jni_util.cc @@ -352,13 +352,17 @@ arrow::Result> FromSchemaByteArray( arrow::ipc::DictionaryMemo in_memo; int schemaBytes_len = env->GetArrayLength(schemaBytes); jbyte* schemaBytes_data = env->GetByteArrayElements(schemaBytes, nullptr); + // Ensure the pinned/copied Java array elements are always released, even when + // schema parsing fails and an error Result is returned early below. + auto release_elements = [&](jbyte* data) { + env->ReleaseByteArrayElements(schemaBytes, data, JNI_ABORT); + }; + std::unique_ptr elements_guard(schemaBytes_data, + release_elements); auto serialized_schema = std::make_shared( reinterpret_cast(schemaBytes_data), schemaBytes_len); arrow::io::BufferReader buf_reader(serialized_schema); - ARROW_ASSIGN_OR_RAISE(std::shared_ptr schema, - arrow::ipc::ReadSchema(&buf_reader, &in_memo)) - env->ReleaseByteArrayElements(schemaBytes, schemaBytes_data, JNI_ABORT); - return schema; + return arrow::ipc::ReadSchema(&buf_reader, &in_memo); } arrow::Status ExportRecordBatch(JNIEnv* env, const std::shared_ptr& batch, jlong struct_array) {