Commit 79841330 authored by Lukasz Anforowicz's avatar Lukasz Anforowicz Committed by Commit Bot

Invoke mojo::ProcessErrorCallback synchronously / without PostTask.

Synchronous invocation is desirable to retain the callstack and crash
keys that have led to a mojo::ReportBadMessage call (see #c0 in
https://crbug.com/1057149).

Synchronous invocation should be safe, because mojo APIs should now be
safe for reentrancy (see https://crbug.com/1057149#c5).

Note that even before this CL the default error callback (see
mojo::core::SetDefaultProcessErrorCallback) has been invoked
synchronously (see how Core::ExtractMessagePipeFromInvitation doesn't
wrap |default_process_error_callback_| in any task-aware wrappers).

Bug: 1057149
Change-Id: Ie6848bbdf1e15e23c2f001b9d9a37f85a583acea
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2080090
Commit-Queue: Ken Rockot <rockot@google.com>
Auto-Submit: Łukasz Anforowicz <lukasza@chromium.org>
Reviewed-by: default avatarKen Rockot <rockot@google.com>
Cr-Commit-Position: refs/heads/master@{#745659}
parent eb40846e
...@@ -58,30 +58,20 @@ const uint64_t kUnknownPipeIdForDebug = 0x7f7f7f7f7f7f7f7fUL; ...@@ -58,30 +58,20 @@ const uint64_t kUnknownPipeIdForDebug = 0x7f7f7f7f7f7f7f7fUL;
// invitation. // invitation.
constexpr base::StringPiece kIsolatedInvitationPipeName = {"\0\0\0\0", 4}; constexpr base::StringPiece kIsolatedInvitationPipeName = {"\0\0\0\0", 4};
void InvokeProcessErrorCallbackOnTaskRunner( void InvokeProcessErrorCallback(MojoProcessErrorHandler handler,
scoped_refptr<base::SequencedTaskRunner> task_runner, uintptr_t context,
MojoProcessErrorHandler handler, const std::string& error,
uintptr_t context, MojoProcessErrorFlags flags) {
const std::string& error, MojoProcessErrorDetails details;
MojoProcessErrorFlags flags) { details.struct_size = sizeof(details);
// We always run the handler asynchronously to ensure no Mojo core reentrancy. DCHECK(base::IsValueInRangeForNumericType<uint32_t>(error.size()));
task_runner->PostTask( details.error_message_length = static_cast<uint32_t>(error.size());
FROM_HERE, if (!error.empty())
base::BindOnce( details.error_message = error.data();
[](MojoProcessErrorHandler handler, uintptr_t context, else
const std::string& error, MojoProcessErrorFlags flags) { details.error_message = nullptr;
MojoProcessErrorDetails details; details.flags = flags;
details.struct_size = sizeof(details); handler(context, &details);
DCHECK(base::IsValueInRangeForNumericType<uint32_t>(error.size()));
details.error_message_length = static_cast<uint32_t>(error.size());
if (!error.empty())
details.error_message = error.data();
else
details.error_message = nullptr;
details.flags = flags;
handler(context, &details);
},
handler, context, error, flags));
} }
// Helper class which is bound to the lifetime of a // Helper class which is bound to the lifetime of a
...@@ -93,21 +83,15 @@ void InvokeProcessErrorCallbackOnTaskRunner( ...@@ -93,21 +83,15 @@ void InvokeProcessErrorCallbackOnTaskRunner(
// -- see Core::SendInvitation) will be destroyed. // -- see Core::SendInvitation) will be destroyed.
class ProcessDisconnectHandler { class ProcessDisconnectHandler {
public: public:
ProcessDisconnectHandler(scoped_refptr<base::SequencedTaskRunner> task_runner, ProcessDisconnectHandler(MojoProcessErrorHandler handler, uintptr_t context)
MojoProcessErrorHandler handler, : handler_(handler), context_(context) {}
uintptr_t context)
: task_runner_(std::move(task_runner)),
handler_(handler),
context_(context) {}
~ProcessDisconnectHandler() { ~ProcessDisconnectHandler() {
InvokeProcessErrorCallbackOnTaskRunner( InvokeProcessErrorCallback(handler_, context_, std::string(),
task_runner_, handler_, context_, std::string(), MOJO_PROCESS_ERROR_FLAG_DISCONNECTED);
MOJO_PROCESS_ERROR_FLAG_DISCONNECTED);
} }
private: private:
const scoped_refptr<base::SequencedTaskRunner> task_runner_;
const MojoProcessErrorHandler handler_; const MojoProcessErrorHandler handler_;
const uintptr_t context_; const uintptr_t context_;
...@@ -116,12 +100,11 @@ class ProcessDisconnectHandler { ...@@ -116,12 +100,11 @@ class ProcessDisconnectHandler {
void RunMojoProcessErrorHandler( void RunMojoProcessErrorHandler(
ProcessDisconnectHandler* disconnect_handler, ProcessDisconnectHandler* disconnect_handler,
scoped_refptr<base::SequencedTaskRunner> task_runner,
MojoProcessErrorHandler handler, MojoProcessErrorHandler handler,
uintptr_t context, uintptr_t context,
const std::string& error) { const std::string& error) {
InvokeProcessErrorCallbackOnTaskRunner(task_runner, handler, context, error, InvokeProcessErrorCallback(handler, context, error,
MOJO_PROCESS_ERROR_FLAG_NONE); MOJO_PROCESS_ERROR_FLAG_NONE);
} }
} // namespace } // namespace
...@@ -1283,12 +1266,11 @@ MojoResult Core::SendInvitation( ...@@ -1283,12 +1266,11 @@ MojoResult Core::SendInvitation(
ProcessErrorCallback process_error_callback; ProcessErrorCallback process_error_callback;
if (error_handler) { if (error_handler) {
auto error_handler_task_runner = GetNodeController()->io_task_runner(); process_error_callback =
process_error_callback = base::BindRepeating( base::BindRepeating(&RunMojoProcessErrorHandler,
&RunMojoProcessErrorHandler, base::Owned(new ProcessDisconnectHandler(
base::Owned(new ProcessDisconnectHandler( error_handler, error_handler_context)),
error_handler_task_runner, error_handler, error_handler_context)), error_handler, error_handler_context);
error_handler_task_runner, error_handler, error_handler_context);
} else if (default_process_error_callback_) { } else if (default_process_error_callback_) {
process_error_callback = default_process_error_callback_; process_error_callback = default_process_error_callback_;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment