Commit a7129ce3 authored by Ken Rockot's avatar Ken Rockot Committed by Commit Bot

Mojo bindings: Fix data race in Connector

Fixes a data race on the boolean |error_| field. This is almost
certainly innocuous in practice but is technically UB, and TSan
complains.

Bug: 850091
Change-Id: Icc6bfbc0a2e2bda6a87c455856ff5f3153568a02
Reviewed-on: https://chromium-review.googlesource.com/1105340Reviewed-by: default avatarJay Civelli <jcivelli@chromium.org>
Commit-Queue: Ken Rockot <rockot@chromium.org>
Cr-Commit-Position: refs/heads/master@{#568283}
parent 0ef461ea
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
#ifndef MOJO_PUBLIC_CPP_BINDINGS_CONNECTOR_H_ #ifndef MOJO_PUBLIC_CPP_BINDINGS_CONNECTOR_H_
#define MOJO_PUBLIC_CPP_BINDINGS_CONNECTOR_H_ #define MOJO_PUBLIC_CPP_BINDINGS_CONNECTOR_H_
#include <atomic>
#include <memory> #include <memory>
#include <utility> #include <utility>
...@@ -234,7 +235,7 @@ class MOJO_CPP_BINDINGS_EXPORT Connector : public MessageReceiver { ...@@ -234,7 +235,7 @@ class MOJO_CPP_BINDINGS_EXPORT Connector : public MessageReceiver {
std::unique_ptr<SimpleWatcher> handle_watcher_; std::unique_ptr<SimpleWatcher> handle_watcher_;
base::Optional<HandleSignalTracker> peer_remoteness_tracker_; base::Optional<HandleSignalTracker> peer_remoteness_tracker_;
bool error_ = false; std::atomic<bool> error_;
bool drop_writes_ = false; bool drop_writes_ = false;
bool enforce_errors_from_incoming_receiver_ = true; bool enforce_errors_from_incoming_receiver_ = true;
......
...@@ -140,6 +140,7 @@ Connector::Connector(ScopedMessagePipeHandle message_pipe, ...@@ -140,6 +140,7 @@ Connector::Connector(ScopedMessagePipeHandle message_pipe,
scoped_refptr<base::SequencedTaskRunner> runner) scoped_refptr<base::SequencedTaskRunner> runner)
: message_pipe_(std::move(message_pipe)), : message_pipe_(std::move(message_pipe)),
task_runner_(std::move(runner)), task_runner_(std::move(runner)),
error_(false),
outgoing_serialization_mode_(g_default_outgoing_serialization_mode), outgoing_serialization_mode_(g_default_outgoing_serialization_mode),
incoming_serialization_mode_(g_default_incoming_serialization_mode), incoming_serialization_mode_(g_default_incoming_serialization_mode),
nesting_observer_(RunLoopNestingObserver::GetForThread()), nesting_observer_(RunLoopNestingObserver::GetForThread()),
...@@ -263,9 +264,6 @@ bool Connector::Accept(Message* message) { ...@@ -263,9 +264,6 @@ bool Connector::Accept(Message* message) {
if (!lock_) if (!lock_)
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
// It shouldn't hurt even if |error_| may be changed by a different sequence
// at the same time. The outcome is that we may write into |message_pipe_|
// after encountering an error, which should be fine.
if (error_) if (error_)
return false; return false;
......
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