summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Vladimir Marko <vmarko@google.com> 2021-03-04 14:24:38 +0000
committer Treehugger Robot <treehugger-gerrit@google.com> 2021-03-05 12:07:49 +0000
commitc714f40caec532522ecc5e611b15e857b3b65484 (patch)
tree598daf5db137ae9bceab4e676c72c724d180d251
parent17b4d2b14fd26088bca195b5d7c48f26b8b545d8 (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.cc2
-rw-r--r--test/178-app-image-native-method/src/Main.java25
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();
+}