diff options
author | Orion Hodson <oth@google.com> | 2020-07-10 19:17:13 +0000 |
---|---|---|
committer | Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> | 2020-07-10 19:17:13 +0000 |
commit | 0f8e84ab3997b4dc3b3b93a70d5fb8f1e32413bf (patch) | |
tree | f62a5fe1b4ea102a63b60f5c6b5abf9f06854816 | |
parent | 494510ce5e2be4181bd83899929b474e726eb468 (diff) | |
parent | 67b0a6609cca48616de42eb9cba8b26fdd5e7d69 (diff) | |
download | art-0f8e84ab3997b4dc3b3b93a70d5fb8f1e32413bf.tar.gz |
Revert "Additional checks in GetDirectBuffer{Address,Capacity}" am: 337cf0aa8a am: 67b0a6609c
Original change: https://googleplex-android-review.googlesource.com/c/platform/art/+/12128184
Change-Id: I54baf1400f3bfe9ac473571ad5b3ca79314200f2
-rw-r--r-- | runtime/jni/jni_internal.cc | 20 | ||||
-rw-r--r-- | runtime/jni/jni_internal_test.cc | 29 | ||||
-rw-r--r-- | runtime/well_known_classes.cc | 20 | ||||
-rw-r--r-- | runtime/well_known_classes.h | 4 |
4 files changed, 20 insertions, 53 deletions
diff --git a/runtime/jni/jni_internal.cc b/runtime/jni/jni_internal.cc index b228d9910c..67073a8e30 100644 --- a/runtime/jni/jni_internal.cc +++ b/runtime/jni/jni_internal.cc @@ -2519,29 +2519,13 @@ class JNI { } static void* GetDirectBufferAddress(JNIEnv* env, jobject java_buffer) { - // Return null if |java_buffer| is not defined. - if (java_buffer == nullptr) { - return nullptr; - } - - // Return null if |java_buffer| is not a java.nio.Buffer instance. - if (!IsInstanceOf(env, java_buffer, WellKnownClasses::java_nio_Buffer)) { - return nullptr; - } - - // Buffer.address is non-null when the |java_buffer| is direct. return reinterpret_cast<void*>(env->GetLongField( - java_buffer, WellKnownClasses::java_nio_Buffer_address)); + java_buffer, WellKnownClasses::java_nio_DirectByteBuffer_effectiveDirectAddress)); } static jlong GetDirectBufferCapacity(JNIEnv* env, jobject java_buffer) { - // Check if |java_buffer| is a direct buffer, bail if not. - if (GetDirectBufferAddress(env, java_buffer) == nullptr) { - return -1; - } - return static_cast<jlong>(env->GetIntField( - java_buffer, WellKnownClasses::java_nio_Buffer_capacity)); + java_buffer, WellKnownClasses::java_nio_DirectByteBuffer_capacity)); } static jobjectRefType GetObjectRefType(JNIEnv* env ATTRIBUTE_UNUSED, jobject java_object) { diff --git a/runtime/jni/jni_internal_test.cc b/runtime/jni/jni_internal_test.cc index 02e1ad4670..a4b3801de7 100644 --- a/runtime/jni/jni_internal_test.cc +++ b/runtime/jni/jni_internal_test.cc @@ -2281,30 +2281,11 @@ TEST_F(JniInternalTest, NewDirectBuffer_GetDirectBufferAddress_GetDirectBufferCa ASSERT_NE(buffer_class, nullptr); char bytes[1024]; - jobject direct_buffer = env_->NewDirectByteBuffer(bytes, sizeof(bytes)); - ASSERT_NE(direct_buffer, nullptr); - ASSERT_TRUE(env_->IsInstanceOf(direct_buffer, buffer_class)); - ASSERT_EQ(env_->GetDirectBufferAddress(direct_buffer), bytes); - ASSERT_EQ(env_->GetDirectBufferCapacity(direct_buffer), static_cast<jlong>(sizeof(bytes))); - - // Check we don't crash if a nullptr is passed to field accessors. - ASSERT_EQ(env_->GetDirectBufferAddress(nullptr), nullptr); - ASSERT_EQ(env_->GetDirectBufferCapacity(nullptr), -1L); - - // Check if j.n.Buffer types backed by heap memory return the invalid values described in the - // RETURNS clauses of JNI spec for GetDirectBufferAddress() and GetDirectBufferCapacity(). - ScopedLocalRef<jclass> bb(env_, env_->FindClass("java/nio/ByteBuffer")); - jmethodID bb_allocate = env_->GetStaticMethodID(bb.get(), "allocate", "(I)Ljava/nio/ByteBuffer;"); - jobject heap_buffer = env_->CallStaticObjectMethod(bb.get(), bb_allocate, 128); - ASSERT_NE(heap_buffer, nullptr); - ASSERT_EQ(env_->GetDirectBufferAddress(heap_buffer), nullptr); - ASSERT_EQ(env_->GetDirectBufferCapacity(heap_buffer), -1L); - - // Check invalid values are returned if the buffer argument has an object type is not a sub-type - // of j.n.Buffer. - jobject not_buffer = env_->NewStringUTF("A String"); - ASSERT_EQ(env_->GetDirectBufferAddress(not_buffer), nullptr); - ASSERT_EQ(env_->GetDirectBufferCapacity(not_buffer), -1L); + jobject buffer = env_->NewDirectByteBuffer(bytes, sizeof(bytes)); + ASSERT_NE(buffer, nullptr); + ASSERT_TRUE(env_->IsInstanceOf(buffer, buffer_class)); + ASSERT_EQ(env_->GetDirectBufferAddress(buffer), bytes); + ASSERT_EQ(env_->GetDirectBufferCapacity(buffer), static_cast<jlong>(sizeof(bytes))); { CheckJniAbortCatcher check_jni_abort_catcher; diff --git a/runtime/well_known_classes.cc b/runtime/well_known_classes.cc index 27eb28a58e..fabd4dbd1f 100644 --- a/runtime/well_known_classes.cc +++ b/runtime/well_known_classes.cc @@ -75,7 +75,6 @@ jclass WellKnownClasses::java_lang_System; jclass WellKnownClasses::java_lang_Thread; jclass WellKnownClasses::java_lang_ThreadGroup; jclass WellKnownClasses::java_lang_Throwable; -jclass WellKnownClasses::java_nio_Buffer; jclass WellKnownClasses::java_nio_ByteBuffer; jclass WellKnownClasses::java_nio_DirectByteBuffer; jclass WellKnownClasses::java_util_Collections; @@ -154,7 +153,6 @@ jfieldID WellKnownClasses::java_lang_Throwable_stackTrace; jfieldID WellKnownClasses::java_lang_Throwable_stackState; jfieldID WellKnownClasses::java_lang_Throwable_suppressedExceptions; jfieldID WellKnownClasses::java_nio_Buffer_address; -jfieldID WellKnownClasses::java_nio_Buffer_capacity; jfieldID WellKnownClasses::java_nio_Buffer_elementSizeShift; jfieldID WellKnownClasses::java_nio_Buffer_limit; jfieldID WellKnownClasses::java_nio_Buffer_position; @@ -163,6 +161,8 @@ jfieldID WellKnownClasses::java_nio_ByteBuffer_hb; jfieldID WellKnownClasses::java_nio_ByteBuffer_isReadOnly; jfieldID WellKnownClasses::java_nio_ByteBuffer_limit; jfieldID WellKnownClasses::java_nio_ByteBuffer_offset; +jfieldID WellKnownClasses::java_nio_DirectByteBuffer_capacity; +jfieldID WellKnownClasses::java_nio_DirectByteBuffer_effectiveDirectAddress; jfieldID WellKnownClasses::java_util_Collections_EMPTY_LIST; jfieldID WellKnownClasses::libcore_util_EmptyArray_STACK_TRACE_ELEMENT; jfieldID WellKnownClasses::org_apache_harmony_dalvik_ddmc_Chunk_data; @@ -364,7 +364,6 @@ void WellKnownClasses::Init(JNIEnv* env) { java_lang_Thread = CacheClass(env, "java/lang/Thread"); java_lang_ThreadGroup = CacheClass(env, "java/lang/ThreadGroup"); java_lang_Throwable = CacheClass(env, "java/lang/Throwable"); - java_nio_Buffer = CacheClass(env, "java/nio/Buffer"); java_nio_ByteBuffer = CacheClass(env, "java/nio/ByteBuffer"); java_nio_DirectByteBuffer = CacheClass(env, "java/nio/DirectByteBuffer"); java_util_Collections = CacheClass(env, "java/util/Collections"); @@ -446,17 +445,19 @@ void WellKnownClasses::InitFieldsAndMethodsOnly(JNIEnv* env) { java_lang_Throwable_stackState = CacheField(env, java_lang_Throwable, false, "backtrace", "Ljava/lang/Object;"); java_lang_Throwable_suppressedExceptions = CacheField(env, java_lang_Throwable, false, "suppressedExceptions", "Ljava/util/List;"); - java_nio_Buffer_address = CacheField(env, java_nio_Buffer, false, "address", "J"); - java_nio_Buffer_capacity = CacheField(env, java_nio_Buffer, false, "capacity", "I"); - java_nio_Buffer_elementSizeShift = CacheField(env, java_nio_Buffer, false, "_elementSizeShift", "I"); - java_nio_Buffer_limit = CacheField(env, java_nio_Buffer, false, "limit", "I"); - java_nio_Buffer_position = CacheField(env, java_nio_Buffer, false, "position", "I"); + ScopedLocalRef<jclass> java_nio_Buffer(env, env->FindClass("java/nio/Buffer")); + java_nio_Buffer_address = CacheField(env, java_nio_Buffer.get(), false, "address", "J"); + java_nio_Buffer_elementSizeShift = CacheField(env, java_nio_Buffer.get(), false, "_elementSizeShift", "I"); + java_nio_Buffer_limit = CacheField(env, java_nio_Buffer.get(), false, "limit", "I"); + java_nio_Buffer_position = CacheField(env, java_nio_Buffer.get(), false, "position", "I"); java_nio_ByteBuffer_address = CacheField(env, java_nio_ByteBuffer, false, "address", "J"); java_nio_ByteBuffer_hb = CacheField(env, java_nio_ByteBuffer, false, "hb", "[B"); java_nio_ByteBuffer_isReadOnly = CacheField(env, java_nio_ByteBuffer, false, "isReadOnly", "Z"); java_nio_ByteBuffer_limit = CacheField(env, java_nio_ByteBuffer, false, "limit", "I"); java_nio_ByteBuffer_offset = CacheField(env, java_nio_ByteBuffer, false, "offset", "I"); + java_nio_DirectByteBuffer_capacity = CacheField(env, java_nio_DirectByteBuffer, false, "capacity", "I"); + java_nio_DirectByteBuffer_effectiveDirectAddress = CacheField(env, java_nio_DirectByteBuffer, false, "address", "J"); java_util_Collections_EMPTY_LIST = CacheField(env, java_util_Collections, true, "EMPTY_LIST", "Ljava/util/List;"); libcore_util_EmptyArray_STACK_TRACE_ELEMENT = CacheField(env, libcore_util_EmptyArray, true, "STACK_TRACE_ELEMENT", "[Ljava/lang/StackTraceElement;"); org_apache_harmony_dalvik_ddmc_Chunk_data = CacheField(env, org_apache_harmony_dalvik_ddmc_Chunk, false, "data", "[B"); @@ -537,7 +538,6 @@ void WellKnownClasses::Clear() { java_lang_ThreadGroup = nullptr; java_lang_Throwable = nullptr; java_util_Collections = nullptr; - java_nio_Buffer = nullptr; java_nio_ByteBuffer = nullptr; java_nio_DirectByteBuffer = nullptr; libcore_reflect_AnnotationFactory = nullptr; @@ -617,6 +617,8 @@ void WellKnownClasses::Clear() { java_nio_ByteBuffer_isReadOnly = nullptr; java_nio_ByteBuffer_limit = nullptr; java_nio_ByteBuffer_offset = nullptr; + java_nio_DirectByteBuffer_capacity = nullptr; + java_nio_DirectByteBuffer_effectiveDirectAddress = nullptr; java_util_Collections_EMPTY_LIST = nullptr; libcore_util_EmptyArray_STACK_TRACE_ELEMENT = nullptr; org_apache_harmony_dalvik_ddmc_Chunk_data = nullptr; diff --git a/runtime/well_known_classes.h b/runtime/well_known_classes.h index fe17849acb..6f67fde6ed 100644 --- a/runtime/well_known_classes.h +++ b/runtime/well_known_classes.h @@ -88,7 +88,6 @@ struct WellKnownClasses { static jclass java_lang_Thread; static jclass java_lang_ThreadGroup; static jclass java_lang_Throwable; - static jclass java_nio_Buffer; static jclass java_nio_ByteBuffer; static jclass java_nio_DirectByteBuffer; static jclass java_util_Collections; @@ -167,7 +166,6 @@ struct WellKnownClasses { static jfieldID java_lang_Throwable_stackState; static jfieldID java_lang_Throwable_suppressedExceptions; static jfieldID java_nio_Buffer_address; - static jfieldID java_nio_Buffer_capacity; static jfieldID java_nio_Buffer_elementSizeShift; static jfieldID java_nio_Buffer_limit; static jfieldID java_nio_Buffer_position; @@ -176,6 +174,8 @@ struct WellKnownClasses { static jfieldID java_nio_ByteBuffer_isReadOnly; static jfieldID java_nio_ByteBuffer_limit; static jfieldID java_nio_ByteBuffer_offset; + static jfieldID java_nio_DirectByteBuffer_capacity; + static jfieldID java_nio_DirectByteBuffer_effectiveDirectAddress; static jfieldID java_util_Collections_EMPTY_LIST; static jfieldID libcore_util_EmptyArray_STACK_TRACE_ELEMENT; |