From 834df830d62d4ab3aa87dbe4329dc46ede1da2c3 Mon Sep 17 00:00:00 2001 From: David Li Date: Fri, 12 Jun 2026 14:43:17 +0900 Subject: [PATCH] fix(java/driver/jni): harden JNI exception helpers Replace assert() guards in both ThrowJavaException helpers with proper null checks that return early when JNI calls fail. Also fix malformed JNI method descriptor in ThrowJavaException. When any JNI lookup fails, it leaves a pending exception, so returning early propagates the correct error back to Java. Assisted-by: Claude Opus 4.8 --- java/driver/jni/src/main/cpp/jni_wrapper.cc | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/java/driver/jni/src/main/cpp/jni_wrapper.cc b/java/driver/jni/src/main/cpp/jni_wrapper.cc index 6af1a247c3..859b37bf96 100644 --- a/java/driver/jni/src/main/cpp/jni_wrapper.cc +++ b/java/driver/jni/src/main/cpp/jni_wrapper.cc @@ -55,13 +55,15 @@ struct AdbcErrorGuard { void ThrowJavaException(JNIEnv* env, const std::string& klass, const std::string& message) { jclass exception_klass = env->FindClass(klass.c_str()); - assert(exception_klass != nullptr); + if (exception_klass == nullptr) return; jmethodID exception_ctor = - env->GetMethodID(exception_klass, "", "(Ljava/lang/String)V"); - assert(exception_ctor != nullptr); + env->GetMethodID(exception_klass, "", "(Ljava/lang/String;)V"); + if (exception_ctor == nullptr) return; jstring message_jni = env->NewStringUTF(message.c_str()); + if (message_jni == nullptr) return; auto exc = static_cast( env->NewObject(exception_klass, exception_ctor, message_jni)); + if (exc == nullptr) return; env->Throw(exc); } @@ -73,16 +75,16 @@ struct AdbcException { void ThrowJavaException(JNIEnv* env) const { jclass exception_klass = env->FindClass("org/apache/arrow/adbc/core/AdbcException"); - assert(exception_klass != nullptr); + if (exception_klass == nullptr) return; jmethodID exception_ctor = env->GetMethodID(exception_klass, "", "(Ljava/lang/String;Ljava/lang/Throwable;" "Lorg/apache/arrow/adbc/core/AdbcStatusCode;" "Ljava/lang/String;I)V"); - assert(exception_ctor != nullptr); + if (exception_ctor == nullptr) return; jclass status_klass = env->FindClass("org/apache/arrow/adbc/core/AdbcStatusCode"); - assert(status_klass != nullptr); + if (status_klass == nullptr) return; jfieldID status_field; @@ -113,12 +115,15 @@ struct AdbcException { break; } #undef CASE + if (status_field == nullptr) return; jobject status_jni = env->GetStaticObjectField(status_klass, status_field); jstring message_jni = env->NewStringUTF(message.c_str()); + if (message_jni == nullptr) return; auto exc = static_cast(env->NewObject( exception_klass, exception_ctor, message_jni, /*cause=*/nullptr, status_jni, /*sqlState=*/nullptr, /*vendorCode=*/0)); + if (exc == nullptr) return; env->Throw(exc); } };