Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(375)

Unified Diff: mojo/public/cpp/bindings/lib/connector.cc

Issue 2064903002: Mojo: Report bindings validation errors via MojoNotifyBadMessage (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: . Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: mojo/public/cpp/bindings/lib/connector.cc
diff --git a/mojo/public/cpp/bindings/lib/connector.cc b/mojo/public/cpp/bindings/lib/connector.cc
index 9f1037ceae81b09ef3948d6532b7f1cec9a524ff..d1cb1dc25e7229ced69e31fd1ad80127da014fd7 100644
--- a/mojo/public/cpp/bindings/lib/connector.cc
+++ b/mojo/public/cpp/bindings/lib/connector.cc
@@ -87,8 +87,13 @@ ScopedMessagePipeHandle Connector::PassMessagePipe() {
return std::move(message_pipe_);
}
-void Connector::RaiseError() {
+void Connector::RaiseError(Result error) {
DCHECK(thread_checker_.CalledOnValidThread());
+ DCHECK(!error.Succeeded());
+
+ // If this was a message validation error, notify the system of a bad message.
+ if (error.type() == Result::Type::BAD_MESSAGE)
+ error.message().NotifyBadMessage(error.details());
HandleError(true, true);
}
@@ -135,19 +140,19 @@ void Connector::ResumeIncomingMethodCallProcessing() {
WaitToReadMore();
}
-bool Connector::Accept(Message* message) {
+MessageReceiver::Result Connector::Accept(Message* message) {
DCHECK(lock_ || thread_checker_.CalledOnValidThread());
// It shouldn't hurt even if |error_| may be changed by a different thread at
// the same time. The outcome is that we may write into |message_pipe_| after
// encountering an error, which should be fine.
if (error_)
- return false;
+ return Result(Result::Type::SEND_FAILED);
MayAutoLock locker(lock_.get());
if (!message_pipe_.is_valid() || drop_writes_)
- return true;
+ return Result::ForSuccess();
MojoResult rv =
WriteMessageNew(message_pipe_.get(), message->TakeMojoMessage(),
@@ -175,13 +180,13 @@ bool Connector::Accept(Message* message) {
// crbug.com/389666, etc. are resolved, this will make tests fail quickly
// rather than hanging.)
CHECK(false) << "Race condition or other bug detected";
- return false;
+ return Result(Result::Type::SEND_FAILED);
default:
// This particular write was rejected, presumably because of bad input.
// The pipe is not necessarily in a bad state.
- return false;
+ return Result(Result::Type::SEND_FAILED);
}
- return true;
+ return Result::ForSuccess();
}
void Connector::AllowWokenUpBySyncWatchOnSameThread() {
@@ -256,7 +261,7 @@ void Connector::WaitToReadMore() {
bool Connector::ReadSingleMessage(MojoResult* read_result) {
CHECK(!paused_);
- bool receiver_result = false;
+ bool received_message = false;
// Detect if |this| was destroyed during message dispatch. Allow for the
// possibility of re-entering ReadMore() through message dispatch.
@@ -266,9 +271,11 @@ bool Connector::ReadSingleMessage(MojoResult* read_result) {
const MojoResult rv = ReadMessage(message_pipe_.get(), &message);
*read_result = rv;
- if (rv == MOJO_RESULT_OK) {
- receiver_result =
- incoming_receiver_ && incoming_receiver_->Accept(&message);
+ if (rv == MOJO_RESULT_OK && incoming_receiver_) {
+ Result result = incoming_receiver_->Accept(&message);
+ if (result.type() == Result::Type::BAD_MESSAGE)
+ result.message().NotifyBadMessage(result.details());
+ received_message = result.Succeeded();
}
if (!weak_self)
@@ -282,7 +289,7 @@ bool Connector::ReadSingleMessage(MojoResult* read_result) {
return false;
}
- if (enforce_errors_from_incoming_receiver_ && !receiver_result) {
+ if (enforce_errors_from_incoming_receiver_ && !received_message) {
HandleError(true, false);
return false;
}

Powered by Google App Engine
This is Rietveld 408576698