summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Mathieu Chartier <mathieuc@google.com> 2013-12-19 14:59:00 -0800
committer Mathieu Chartier <mathieuc@google.com> 2013-12-19 15:14:42 -0800
commite8c48db6bb507d7fa20c78481c58c23be0045f67 (patch)
treeceac197a9d9f32609f845377e9fe87949bff5527
parente40687d053b89c495b6fbeb7a766b01c9c7e039c (diff)
Fix NewLocalRef, NewGlobalRef to handle cleared weak globals.
We were not checking for null after decoding the reference, this meant that we incorrectly created null weak global references instead of returning null. Issue: 63929 Change-Id: I9159682e6edad8f415ef8144fc13b9aedd2cceb4
-rw-r--r--runtime/jni_internal.cc19
-rw-r--r--runtime/thread.cc2
2 files changed, 12 insertions, 9 deletions
diff --git a/runtime/jni_internal.cc b/runtime/jni_internal.cc
index 6690519eba..bbe5fda62f 100644
--- a/runtime/jni_internal.cc
+++ b/runtime/jni_internal.cc
@@ -844,13 +844,14 @@ class JNI {
}
static jobject NewGlobalRef(JNIEnv* env, jobject obj) {
- if (obj == NULL) {
- return NULL;
- }
ScopedObjectAccess soa(env);
+ Object* decoded_obj = soa.Decode<Object*>(obj);
+ // Check for null after decoding the object to handle cleared weak globals.
+ if (decoded_obj == nullptr) {
+ return nullptr;
+ }
JavaVMExt* vm = soa.Vm();
IndirectReferenceTable& globals = vm->globals;
- Object* decoded_obj = soa.Decode<Object*>(obj);
WriterMutexLock mu(soa.Self(), vm->globals_lock);
IndirectRef ref = globals.Add(IRT_FIRST_SEGMENT, decoded_obj);
return reinterpret_cast<jobject>(ref);
@@ -884,11 +885,13 @@ class JNI {
}
static jobject NewLocalRef(JNIEnv* env, jobject obj) {
- if (obj == NULL) {
- return NULL;
- }
ScopedObjectAccess soa(env);
- return soa.AddLocalReference<jobject>(soa.Decode<Object*>(obj));
+ mirror::Object* decoded_obj = soa.Decode<Object*>(obj);
+ // Check for null after decoding the object to handle cleared weak globals.
+ if (decoded_obj == nullptr) {
+ return nullptr;
+ }
+ return soa.AddLocalReference<jobject>(decoded_obj);
}
static void DeleteLocalRef(JNIEnv* env, jobject obj) {
diff --git a/runtime/thread.cc b/runtime/thread.cc
index bc252deecc..9faa60dbf8 100644
--- a/runtime/thread.cc
+++ b/runtime/thread.cc
@@ -1147,7 +1147,7 @@ mirror::Object* Thread::DecodeJObject(jobject obj) const {
result = Runtime::Current()->GetJavaVM()->DecodeWeakGlobal(const_cast<Thread*>(this), ref);
if (result == kClearedJniWeakGlobal) {
// This is a special case where it's okay to return NULL.
- return NULL;
+ return nullptr;
}
}