Chromium Code Reviews| Index: mojo/public/cpp/bindings/lib/control_message_handler.cc |
| diff --git a/mojo/public/cpp/bindings/lib/control_message_handler.cc b/mojo/public/cpp/bindings/lib/control_message_handler.cc |
| index b9bf7eb54ed5aaf96078f62181e58a42af7aa4ca..2e7dc5e6e14a1da65d9eb66a410e8bdbbbadc928 100644 |
| --- a/mojo/public/cpp/bindings/lib/control_message_handler.cc |
| +++ b/mojo/public/cpp/bindings/lib/control_message_handler.cc |
| @@ -11,10 +11,42 @@ |
| #include "base/logging.h" |
| #include "mojo/public/cpp/bindings/lib/message_builder.h" |
| #include "mojo/public/cpp/bindings/lib/serialization.h" |
| +#include "mojo/public/cpp/bindings/lib/validation_util.h" |
| #include "mojo/public/interfaces/bindings/interface_control_messages.mojom.h" |
| namespace mojo { |
| namespace internal { |
| +namespace { |
| + |
| +bool ValidateControlRequestWithResponse(Message* message) { |
| + ValidationContext validation_context( |
| + message->data(), message->data_num_bytes(), message->handles()->size(), |
| + message, "ControlRequestValidator"); |
| + switch (message->header()->name) { |
| + case interface_control::kRunMessageId: |
|
yzshen1
2016/08/31 17:06:46
We should also do ValidateMessageIsRequestExpectin
Sam McNally
2016/09/01 00:44:36
Done.
|
| + return ValidateMessagePayload< |
| + interface_control::internal::RunMessageParams_Data>( |
| + message, &validation_context); |
| + } |
| + return false; |
| +} |
| + |
| +bool ValidateControlRequestWithoutResponse(Message* message) { |
| + ValidationContext validation_context( |
| + message->data(), message->data_num_bytes(), message->handles()->size(), |
| + message, "ControlRequestValidator"); |
| + switch (message->header()->name) { |
| + case interface_control::kRunOrClosePipeMessageId: |
| + return ValidateMessageIsRequestWithoutResponse(message, |
| + &validation_context) && |
| + ValidateMessagePayload< |
| + interface_control::internal::RunOrClosePipeMessageParams_Data>( |
| + message, &validation_context); |
| + } |
| + return false; |
| +} |
| + |
| +} // namespace |
| // static |
| bool ControlMessageHandler::IsControlMessage(const Message* message) { |
| @@ -30,6 +62,9 @@ ControlMessageHandler::~ControlMessageHandler() { |
| } |
| bool ControlMessageHandler::Accept(Message* message) { |
| + if (!ValidateControlRequestWithoutResponse(message)) |
| + return false; |
| + |
| if (message->header()->name == interface_control::kRunOrClosePipeMessageId) |
| return RunOrClosePipe(message); |
| @@ -40,6 +75,9 @@ bool ControlMessageHandler::Accept(Message* message) { |
| bool ControlMessageHandler::AcceptWithResponder( |
| Message* message, |
| MessageReceiverWithStatus* responder) { |
| + if (!ValidateControlRequestWithResponse(message)) |
| + return false; |
| + |
| if (message->header()->name == interface_control::kRunMessageId) |
| return Run(message, responder); |
| @@ -61,6 +99,8 @@ bool ControlMessageHandler::Run(Message* message, |
| output->set_query_version_result( |
| interface_control::QueryVersionResult::New()); |
| output->get_query_version_result()->version = interface_version_; |
| + } else if (input.is_flush_for_testing()) { |
| + output.reset(); |
| } else { |
| output.reset(); |
| } |