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:
@@ -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,
|
||||
|
||||
@@ -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_; }
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user