From d1e5e393c30ef25212be365651404c1034532338 Mon Sep 17 00:00:00 2001 From: Babneet Singh Date: Mon, 4 May 2020 16:08:53 -0400 Subject: [PATCH] HDFS-15270. Account for *env == NULL in hdfsThreadDestructor (#1951) OpenJ9 JVM properly terminates the thread before hdfsThreadDestructor is invoked. JNIEnv is a mirror of J9VMThread in OpenJ9. After proper thread termination, accessing JNIEnv in hdfsThreadDestructor (*env)->GetJavaVM, yields a SIGSEGV since *env is NULL after thread cleanup is performed. The main purpose of hdfsThreadDestructor is to invoke DetachCurrentThread, which performs thread cleanup in OpenJ9. Since OpenJ9 performs thread cleanup before hdfsThreadDestructor is invoked, hdfsThreadDestructor should account for *env == NULL and skip DetachCurrentThread. Signed-off-by: Babneet Singh (cherry picked from commit 1996351b0b7be6866eda73223ab6ef1ec78d30cd) --- .../src/main/native/libhdfs/os/posix/thread_local_storage.c | 2 +- .../src/main/native/libhdfs/os/windows/thread_local_storage.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/hadoop-hdfs-project/hadoop-hdfs-native-client/src/main/native/libhdfs/os/posix/thread_local_storage.c b/hadoop-hdfs-project/hadoop-hdfs-native-client/src/main/native/libhdfs/os/posix/thread_local_storage.c index a0f26c6cb6..1b6dafaba8 100644 --- a/hadoop-hdfs-project/hadoop-hdfs-native-client/src/main/native/libhdfs/os/posix/thread_local_storage.c +++ b/hadoop-hdfs-project/hadoop-hdfs-native-client/src/main/native/libhdfs/os/posix/thread_local_storage.c @@ -53,7 +53,7 @@ void hdfsThreadDestructor(void *v) char thr_name[MAXTHRID]; /* Detach the current thread from the JVM */ - if (env) { + if ((env != NULL) && (*env != NULL)) { ret = (*env)->GetJavaVM(env, &vm); if (ret != 0) { diff --git a/hadoop-hdfs-project/hadoop-hdfs-native-client/src/main/native/libhdfs/os/windows/thread_local_storage.c b/hadoop-hdfs-project/hadoop-hdfs-native-client/src/main/native/libhdfs/os/windows/thread_local_storage.c index a6f48fd4a8..f7abc89908 100644 --- a/hadoop-hdfs-project/hadoop-hdfs-native-client/src/main/native/libhdfs/os/windows/thread_local_storage.c +++ b/hadoop-hdfs-project/hadoop-hdfs-native-client/src/main/native/libhdfs/os/windows/thread_local_storage.c @@ -46,10 +46,10 @@ static void detachCurrentThreadFromJvm() if (threadLocalStorageGet(&state) || !state) { return; } - if (!state->env) { + env = state->env; + if ((env == NULL) || (*env == NULL)) { return; } - env = state->env; ret = (*env)->GetJavaVM(env, &vm); if (ret) { fprintf(stderr,