diff options
| -rw-r--r-- | runtime/openjdkjvmti/ti_class.cc | 33 | ||||
| -rwxr-xr-x | test/etc/run-test-jar | 6 |
2 files changed, 29 insertions, 10 deletions
diff --git a/runtime/openjdkjvmti/ti_class.cc b/runtime/openjdkjvmti/ti_class.cc index e0af6e8dee..dd90a71240 100644 --- a/runtime/openjdkjvmti/ti_class.cc +++ b/runtime/openjdkjvmti/ti_class.cc @@ -129,6 +129,25 @@ static std::unique_ptr<const art::DexFile> MakeSingleDexFile(art::Thread* self, return dex_file; } +// A deleter that acts like the jvmtiEnv->Deallocate so that asan does not get tripped up. +// TODO We should everything use the actual jvmtiEnv->Allocate/Deallocate functions once we can +// figure out which env to use. +template <typename T> +class FakeJvmtiDeleter { + public: + FakeJvmtiDeleter() {} + + FakeJvmtiDeleter(FakeJvmtiDeleter&) = default; + FakeJvmtiDeleter(FakeJvmtiDeleter&&) = default; + FakeJvmtiDeleter& operator=(const FakeJvmtiDeleter&) = default; + + template <typename U> void operator()(const U* ptr) const { + if (ptr != nullptr) { + free(const_cast<U*>(ptr)); + } + } +}; + struct ClassCallback : public art::ClassLoadCallback { void ClassPreDefine(const char* descriptor, art::Handle<art::mirror::Class> klass, @@ -173,7 +192,8 @@ struct ClassCallback : public art::ClassLoadCallback { // Call all Non-retransformable agents. jint post_no_redefine_len = 0; unsigned char* post_no_redefine_dex_data = nullptr; - std::unique_ptr<const unsigned char> post_no_redefine_unique_ptr(nullptr); + std::unique_ptr<const unsigned char, FakeJvmtiDeleter<const unsigned char>> + post_no_redefine_unique_ptr(nullptr, FakeJvmtiDeleter<const unsigned char>()); event_handler->DispatchEvent<ArtJvmtiEvent::kClassFileLoadHookNonRetransformable>( self, static_cast<JNIEnv*>(env), @@ -190,13 +210,16 @@ struct ClassCallback : public art::ClassLoadCallback { post_no_redefine_dex_data = const_cast<unsigned char*>(dex_file_copy->Begin()); post_no_redefine_len = dex_file_copy->Size(); } else { - post_no_redefine_unique_ptr = std::unique_ptr<const unsigned char>(post_no_redefine_dex_data); + post_no_redefine_unique_ptr = + std::unique_ptr<const unsigned char, FakeJvmtiDeleter<const unsigned char>>( + post_no_redefine_dex_data, FakeJvmtiDeleter<const unsigned char>()); DCHECK_GT(post_no_redefine_len, 0); } // Call all retransformable agents. jint final_len = 0; unsigned char* final_dex_data = nullptr; - std::unique_ptr<const unsigned char> final_dex_unique_ptr(nullptr); + std::unique_ptr<const unsigned char, FakeJvmtiDeleter<const unsigned char>> + final_dex_unique_ptr(nullptr, FakeJvmtiDeleter<const unsigned char>()); event_handler->DispatchEvent<ArtJvmtiEvent::kClassFileLoadHookRetransformable>( self, static_cast<JNIEnv*>(env), @@ -213,7 +236,9 @@ struct ClassCallback : public art::ClassLoadCallback { final_dex_data = post_no_redefine_dex_data; final_len = post_no_redefine_len; } else { - final_dex_unique_ptr = std::unique_ptr<const unsigned char>(final_dex_data); + final_dex_unique_ptr = + std::unique_ptr<const unsigned char, FakeJvmtiDeleter<const unsigned char>>( + final_dex_data, FakeJvmtiDeleter<const unsigned char>()); DCHECK_GT(final_len, 0); } diff --git a/test/etc/run-test-jar b/test/etc/run-test-jar index a89fe5b0d4..ca52a996ac 100755 --- a/test/etc/run-test-jar +++ b/test/etc/run-test-jar @@ -668,12 +668,6 @@ profman_cmdline=$(echo $profman_cmdline) # Note: this is required as envsetup right now exports detect_leaks=0. RUN_TEST_ASAN_OPTIONS="" -# JVMTI has a mismatch of malloc with delete. b/38322765 -if [ "x$RUN_TEST_ASAN_OPTIONS" != "x" ] ; then - RUN_TEST_ASAN_OPTIONS="${RUN_TEST_ASAN_OPTIONS}:" -fi -RUN_TEST_ASAN_OPTIONS="${RUN_TEST_ASAN_OPTIONS}alloc_dealloc_mismatch=0" - # Multiple shutdown leaks. b/38341789 if [ "x$RUN_TEST_ASAN_OPTIONS" != "x" ] ; then RUN_TEST_ASAN_OPTIONS="${RUN_TEST_ASAN_OPTIONS}:" |