Revert "[VM] Move kernel buffer created by IKG into external typed data with finalizer"

This reverts commit 78462ecbdd.

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 <rmacnak@google.com>

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 <kustermann@google.com>
Commit-Queue: Martin Kustermann <kustermann@google.com>
This commit is contained in:
Martin Kustermann
2018-07-25 12:08:08 +00:00
parent 33914226f2
commit 3801b38e34
3 changed files with 2 additions and 24 deletions
+2 -16
View File
@@ -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,
-2
View File
@@ -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_; }
-6
View File
@@ -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)