diff options
author | Mathieu Chartier <mathieuc@google.com> | 2014-11-15 13:07:39 -0800 |
---|---|---|
committer | Mathieu Chartier <mathieuc@google.com> | 2014-11-17 10:16:34 -0800 |
commit | 41da59665556e8dd5601178185c68d48d645500b (patch) | |
tree | c1f8b5844e3243907a060f663c35370464328609 /runtime/jni_internal_test.cc | |
parent | 410709facb361c5503c7825f01edd264f4450666 (diff) | |
download | android_art-41da59665556e8dd5601178185c68d48d645500b.tar.gz android_art-41da59665556e8dd5601178185c68d48d645500b.tar.bz2 android_art-41da59665556e8dd5601178185c68d48d645500b.zip |
Fix reference leaks in ToReflectedMethod and ToReflectedField
Used ScopedLocalRef to fix, added regression tests.
Bug: 18396311
(cherry picked from commit 8c41753e5eda8322b4d992fe88855058f4c0c2e1)
Change-Id: I0ddfc20ac2384c90ff18586242c1f1d9a6d6eb6d
Diffstat (limited to 'runtime/jni_internal_test.cc')
-rw-r--r-- | runtime/jni_internal_test.cc | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/runtime/jni_internal_test.cc b/runtime/jni_internal_test.cc index ccad137164..e5923deb6f 100644 --- a/runtime/jni_internal_test.cc +++ b/runtime/jni_internal_test.cc @@ -799,6 +799,11 @@ TEST_F(JniInternalTest, FromReflectedField_ToReflectedField) { ASSERT_NE(fid, nullptr); // Turn the fid into a java.lang.reflect.Field... jobject field = env_->ToReflectedField(c, fid, JNI_FALSE); + for (size_t i = 0; i <= 512; ++i) { + // Regression test for b/18396311, ToReflectedField leaking local refs causing a local + // reference table overflows with 512 references to ArtField + env_->DeleteLocalRef(env_->ToReflectedField(c, fid, JNI_FALSE)); + } ASSERT_NE(c, nullptr); ASSERT_TRUE(env_->IsInstanceOf(field, jlrField)); // ...and back again. @@ -825,6 +830,11 @@ TEST_F(JniInternalTest, FromReflectedMethod_ToReflectedMethod) { ASSERT_NE(mid, nullptr); // Turn the mid into a java.lang.reflect.Constructor... jobject method = env_->ToReflectedMethod(c, mid, JNI_FALSE); + for (size_t i = 0; i <= 512; ++i) { + // Regression test for b/18396311, ToReflectedMethod leaking local refs causing a local + // reference table overflows with 512 references to ArtMethod + env_->DeleteLocalRef(env_->ToReflectedMethod(c, mid, JNI_FALSE)); + } ASSERT_NE(method, nullptr); ASSERT_TRUE(env_->IsInstanceOf(method, jlrConstructor)); // ...and back again. |