summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOrion Hodson <oth@google.com>2020-07-10 19:17:13 +0000
committerAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>2020-07-10 19:17:13 +0000
commit0f8e84ab3997b4dc3b3b93a70d5fb8f1e32413bf (patch)
treef62a5fe1b4ea102a63b60f5c6b5abf9f06854816
parent494510ce5e2be4181bd83899929b474e726eb468 (diff)
parent67b0a6609cca48616de42eb9cba8b26fdd5e7d69 (diff)
downloadart-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.cc20
-rw-r--r--runtime/jni/jni_internal_test.cc29
-rw-r--r--runtime/well_known_classes.cc20
-rw-r--r--runtime/well_known_classes.h4
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;