From c96dfe42d27acf53bfc9d0b8579717f54e6df089 Mon Sep 17 00:00:00 2001 From: zy-kkk Date: Thu, 14 Mar 2024 16:04:06 +0800 Subject: [PATCH] [fix](jdbc catalog) fix jdbc-connector coredump as get env return nullptr (#32217) --- be/src/util/jni-util.cpp | 4 ++-- be/src/util/jni-util.h | 11 +++++++++-- be/src/vec/exec/vjdbc_connector.cpp | 2 +- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/be/src/util/jni-util.cpp b/be/src/util/jni-util.cpp index c1ea26798b9924..f48ec9fbf46c32 100644 --- a/be/src/util/jni-util.cpp +++ b/be/src/util/jni-util.cpp @@ -123,7 +123,7 @@ const std::string GetDorisJNIClasspathOption() { jvm_options[i] = {const_cast(options[i].c_str()), nullptr}; } - JNIEnv* env; + JNIEnv* env = nullptr; JavaVMInitArgs vm_args; vm_args.version = JNI_VERSION_1_8; vm_args.options = jvm_options.get(); @@ -389,7 +389,7 @@ Status JniUtil::Init() { RETURN_IF_ERROR(LibJVMLoader::instance().load()); // Get the JNIEnv* corresponding to current thread. - JNIEnv* env; + JNIEnv* env = nullptr; RETURN_IF_ERROR(JniUtil::GetJNIEnv(&env)); if (env == NULL) return Status::InternalError("Failed to get/create JVM"); diff --git a/be/src/util/jni-util.h b/be/src/util/jni-util.h index faa79c91330871..d2a30411b05273 100644 --- a/be/src/util/jni-util.h +++ b/be/src/util/jni-util.h @@ -52,9 +52,16 @@ class JniUtil { static Status GetJNIEnv(JNIEnv** env) { if (tls_env_) { *env = tls_env_; - return Status::OK(); + } else { + Status status = GetJNIEnvSlowPath(env); + if (!status.ok()) { + return status; + } } - return GetJNIEnvSlowPath(env); + if (*env == nullptr) { + return Status::RuntimeError("Failed to get JNIEnv: it is nullptr."); + } + return Status::OK(); } static Status GetGlobalClassRef(JNIEnv* env, const char* class_str, diff --git a/be/src/vec/exec/vjdbc_connector.cpp b/be/src/vec/exec/vjdbc_connector.cpp index 666a06531d215f..23602e52d6d041 100644 --- a/be/src/vec/exec/vjdbc_connector.cpp +++ b/be/src/vec/exec/vjdbc_connector.cpp @@ -98,7 +98,7 @@ Status JdbcConnector::close() { if (_is_in_transaction) { RETURN_IF_ERROR(abort_trans()); } - JNIEnv* env; + JNIEnv* env = nullptr; RETURN_IF_ERROR(JniUtil::GetJNIEnv(&env)); env->DeleteGlobalRef(_executor_clazz); DELETE_BASIC_JAVA_CLAZZ_REF(object)