diff options
| author | 2017-05-22 16:05:59 -0700 | |
|---|---|---|
| committer | 2017-05-22 23:51:26 +0000 | |
| commit | 28b6e7e6746d997f56fb0cb2c5e9ddd7d10e65f4 (patch) | |
| tree | 67648496cf1eb0b0ff59f41e3abf7b34a8fa211c | |
| parent | 2cd620bde125e8cc8653f482f44f81036d3a2846 (diff) | |
Deal with ASAN alloc-dealloc mismatch in class transformation code.
We change the unique_ptr deleters to use 'free' for these allocation
to match the allocations done by malloc.
This is temporary until we find a good way to communicate what
JvmtiEnv the buffers should be dealloced from.
This reverts commit ed81c1d33d328f645d529dd30a8829f303f6d0d3.
Test: SANITIZE_HOST=address test-art-host
Bug: 28322765
Change-Id: Ic60a11041d369c794fba6a70a6ff6d88bbbdd16b
| -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}:" |