From 3801b38e340e2be9fed4e4d08c18bee46df3cca7 Mon Sep 17 00:00:00 2001 From: Martin Kustermann Date: Wed, 25 Jul 2018 12:08:08 +0000 Subject: [PATCH] Revert "[VM] Move kernel buffer created by IKG into external typed data with finalizer" This reverts commit 78462ecbddd809b5966c8b4bd07feda550f06042. Reason for revert: There is code which doesn't hang on to the ExternalTypedData and therefore causes use-after-free. Original change's description: > [VM] Move kernel buffer created by IKG into external typed data with finalizer > > This fixes a memory leak which shows up by lsan in certain situations. > > Change-Id: Ib0d18520a2e57562bc72e79c8e4f070c16509268 > Reviewed-on: https://dart-review.googlesource.com/66383 > Reviewed-by: Ryan Macnak TBR=kustermann@google.com,rmacnak@google.com,zra@google.com Change-Id: I71981b17264b50592b60d844fb3ca795371faaa6 No-Presubmit: true No-Tree-Checks: true No-Try: true Reviewed-on: https://dart-review.googlesource.com/66580 Reviewed-by: Martin Kustermann Commit-Queue: Martin Kustermann --- runtime/vm/isolate_reload.cc | 18 ++---------------- runtime/vm/kernel.h | 2 -- runtime/vm/kernel_binary.cc | 6 ------ 3 files changed, 2 insertions(+), 24 deletions(-) diff --git a/runtime/vm/isolate_reload.cc b/runtime/vm/isolate_reload.cc index e17ae4ac5ab..33d03167150 100644 --- a/runtime/vm/isolate_reload.cc +++ b/runtime/vm/isolate_reload.cc @@ -614,22 +614,8 @@ void IsolateReloadContext::Reload(bool force_reload, return; } did_kernel_compilation = true; - - // The ownership of the kernel buffer goes now to the VM. - const ExternalTypedData& typed_data = ExternalTypedData::Handle( - Z, - ExternalTypedData::New(kExternalTypedDataUint8ArrayCid, retval.kernel, - retval.kernel_size, Heap::kOld)); - struct Helper { - static void Finalize(void* isolate_callback_data, - Dart_WeakPersistentHandle handle, - void* data) { - free(data); - } - }; - typed_data.AddFinalizer(retval.kernel, Helper::Finalize, - retval.kernel_size); - kernel_program.set(kernel::Program::ReadFromTypedData(typed_data)); + kernel_program.set( + kernel::Program::ReadFromBuffer(retval.kernel, retval.kernel_size)); } kernel::KernelLoader::FindModifiedLibraries(kernel_program.get(), I, diff --git a/runtime/vm/kernel.h b/runtime/vm/kernel.h index 5b8e9a2655d..8e1ef208b98 100644 --- a/runtime/vm/kernel.h +++ b/runtime/vm/kernel.h @@ -66,8 +66,6 @@ class Program { static Program* ReadFromBuffer(const uint8_t* buffer, intptr_t buffer_length, const char** error = nullptr); - static Program* ReadFromTypedData(const ExternalTypedData& typed_data, - const char** error = nullptr); bool is_single_program() { return single_program_; } NameIndex main_method() { return main_method_reference_; } diff --git a/runtime/vm/kernel_binary.cc b/runtime/vm/kernel_binary.cc index f8801d88eb0..be3ccbc23dc 100644 --- a/runtime/vm/kernel_binary.cc +++ b/runtime/vm/kernel_binary.cc @@ -161,12 +161,6 @@ Program* Program::ReadFromBuffer(const uint8_t* buffer, return kernel::Program::ReadFrom(&reader, error); } -Program* Program::ReadFromTypedData(const ExternalTypedData& typed_data, - const char** error) { - kernel::Reader reader(typed_data); - return kernel::Program::ReadFrom(&reader, error); -} - } // namespace kernel } // namespace dart #endif // !defined(DART_PRECOMPILED_RUNTIME)