diff options
author | 2020-03-09 14:23:23 -0700 | |
---|---|---|
committer | 2020-04-13 20:44:56 +0000 | |
commit | 36896be3815ce0db8dd5f23accfbee24492d7f8a (patch) | |
tree | fa9c3af4dc45508efa1fe557c9e8d8c65afd9753 | |
parent | 69847caf009afebbc299e24a3cba890adb23750e (diff) |
Don't call exit() while threads may be running
It's unsafe to call exit() in C++ while there are running threads.
The remaining threads would race with static destructors, including
those for the standard library. Call _exit instead.
Bug: 150176543
Test: Boot AOSP, TreeHugger
Change-Id: Ieabf68f43e8b520714643e5ec36a8ca72cc83254
-rw-r--r-- | dalvikvm/dalvikvm.cc | 4 | ||||
-rw-r--r-- | openjdkjvm/OpenjdkJvm.cc | 6 |
2 files changed, 7 insertions, 3 deletions
diff --git a/dalvikvm/dalvikvm.cc b/dalvikvm/dalvikvm.cc index d46779ecfb..4808a1fa09 100644 --- a/dalvikvm/dalvikvm.cc +++ b/dalvikvm/dalvikvm.cc @@ -214,5 +214,7 @@ extern "C" const char *__asan_default_options() { } int main(int argc, char** argv) { - return art::dalvikvm(argc, argv); + // Do not allow static destructors to be called, since it's conceivable that + // daemons may still awaken (literally). + _exit(art::dalvikvm(argc, argv)); } diff --git a/openjdkjvm/OpenjdkJvm.cc b/openjdkjvm/OpenjdkJvm.cc index 8297c54174..675a401bb6 100644 --- a/openjdkjvm/OpenjdkJvm.cc +++ b/openjdkjvm/OpenjdkJvm.cc @@ -313,7 +313,9 @@ JNIEXPORT void JVM_GC(void) { JNIEXPORT __attribute__((noreturn)) void JVM_Exit(jint status) { LOG(INFO) << "System.exit called, status: " << status; art::Runtime::Current()->CallExitHook(status); - exit(status); + // Unsafe to call exit() while threads may still be running. They would race + // with static destructors. + _exit(status); } JNIEXPORT jstring JVM_NativeLoad(JNIEnv* env, @@ -471,7 +473,7 @@ JNIEXPORT __attribute__((noreturn)) jboolean JVM_RaiseSignal(jint signum ATTRIBU } JNIEXPORT __attribute__((noreturn)) void JVM_Halt(jint code) { - exit(code); + _exit(code); } JNIEXPORT jboolean JVM_IsNaN(jdouble d) { |