diff options
author | 2021-03-04 14:24:38 +0000 | |
---|---|---|
committer | 2021-03-05 12:07:49 +0000 | |
commit | c714f40caec532522ecc5e611b15e857b3b65484 (patch) | |
tree | 598daf5db137ae9bceab4e676c72c724d180d251 | |
parent | 17b4d2b14fd26088bca195b5d7c48f26b8b545d8 (diff) |
Fix crash on error paths from GenericJNI trampoline.
Test: Added a regression test to 178-app-image-native-method
Test: testrunner.py --host --optimizing -t 178-app-image-native-method
Bug: 181736463
Change-Id: Ib98d6d58ce1fb8287c32f88fda0f83b7e21ef42d
-rw-r--r-- | runtime/entrypoints/quick/quick_trampoline_entrypoints.cc | 2 | ||||
-rw-r--r-- | test/178-app-image-native-method/src/Main.java | 25 |
2 files changed, 25 insertions, 2 deletions
diff --git a/runtime/entrypoints/quick/quick_trampoline_entrypoints.cc b/runtime/entrypoints/quick/quick_trampoline_entrypoints.cc index 4c67bb97e0..bc5a10db29 100644 --- a/runtime/entrypoints/quick/quick_trampoline_entrypoints.cc +++ b/runtime/entrypoints/quick/quick_trampoline_entrypoints.cc @@ -2114,7 +2114,6 @@ extern "C" const void* artQuickGenericJniTrampoline(Thread* self, Handle<mirror::Class> h_class(hs.NewHandle(declaring_class)); if (!runtime->GetClassLinker()->EnsureInitialized(self, h_class, true, true)) { DCHECK(Thread::Current()->IsExceptionPending()) << called->PrettyMethod(); - self->PopHandleScope(); return nullptr; // Report error. } } @@ -2130,7 +2129,6 @@ extern "C" const void* artQuickGenericJniTrampoline(Thread* self, jobject lock = GetGenericJniSynchronizationObject(self, called); cookie = JniMethodStartSynchronized(lock, self); if (self->IsExceptionPending()) { - self->PopHandleScope(); return nullptr; // Report error. } } else { diff --git a/test/178-app-image-native-method/src/Main.java b/test/178-app-image-native-method/src/Main.java index a9c6f0a967..e6c76ffc5f 100644 --- a/test/178-app-image-native-method/src/Main.java +++ b/test/178-app-image-native-method/src/Main.java @@ -51,6 +51,8 @@ public class Main { $noinline$opt$testMissingCritical(); $noinline$opt$testCriticalSignatures(); + $noinline$regressionTestB181736463(); + new CriticalClinitCheck(); sTestCriticalClinitCheckOtherThread.join(); } @@ -369,6 +371,15 @@ public class Main { 254)); } + static void $noinline$regressionTestB181736463() { + // Regression test for bug 181736463 (GenericJNI crashing when class initializer throws). + try { + BadClassB181736463.nativeMethodVoid(); + throw new Error("Unreachable"); + } catch (B181736463Error expected) { + } + } + static void initializingCriticalClinitCheck() { // Called from CriticalClinitCheck.<clinit>(). // Test @CriticalNative calls on the initializing thread. @@ -823,3 +834,17 @@ class CriticalClinitCheck { Main.initializingCriticalClinitCheck(); } } + +class B181736463Error extends Error { +} + +class BadClassB181736463 { + static { + // Deliberately throw from class initializer. + if (true) { + throw new B181736463Error(); + } + } + + public static native int nativeMethodVoid(); +} |