[securemem] Fix for use-after scope bug in SetPhysicalSecureHeaps
The fit::defer is run after response goes out of scope (because of C++
destructor invocation order).
Fixed: 48997
Change-Id: Idce68a6cb08668cc49fc349c218e7394c9f67279
diff --git a/src/devices/securemem/drivers/aml-securemem/sysmem-secure-mem-server.cc b/src/devices/securemem/drivers/aml-securemem/sysmem-secure-mem-server.cc
index bcab508..d3c6c3b 100644
--- a/src/devices/securemem/drivers/aml-securemem/sysmem-secure-mem-server.cc
+++ b/src/devices/securemem/drivers/aml-securemem/sysmem-secure-mem-server.cc
@@ -115,22 +115,17 @@
llcpp::fuchsia::sysmem::SecureMem::Interface::SetPhysicalSecureHeapsCompleter::Sync completer) {
ZX_DEBUG_ASSERT(thrd_current() == loop_thread_);
// must out-live |complete|
- fidl::aligned<llcpp::fuchsia::sysmem::SecureMem_SetPhysicalSecureHeaps_Response> response;
- // must out-live |complete|
llcpp::fuchsia::sysmem::SecureMem_SetPhysicalSecureHeaps_Result result;
- // ~complete before ~result or ~response
- auto complete = fit::defer([&completer, &result] {
- ZX_DEBUG_ASSERT(!result.has_invalid_tag());
- completer.Reply(std::move(result));
- });
zx_status_t status = SetPhysicalSecureHeapsInternal(heaps);
if (status != ZX_OK) {
LOG(ERROR, "SetPhysicalSecureHeapsInternal() failed - status: %d", status);
result.set_err(fidl::unowned_ptr(&status));
return;
}
+ fidl::aligned<llcpp::fuchsia::sysmem::SecureMem_SetPhysicalSecureHeaps_Response> response;
result.set_response(fidl::unowned_ptr(&response));
- // ~complete, ~result, ~response in that order
+ ZX_DEBUG_ASSERT(!result.has_invalid_tag());
+ completer.Reply(std::move(result));
}
void SysmemSecureMemServer::PostToLoop(fit::closure to_run) {