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

Side by Side Diff: mojo/public/cpp/bindings/lib/control_message_handler.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 unified diff | Download patch
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "mojo/public/cpp/bindings/lib/control_message_handler.h" 5 #include "mojo/public/cpp/bindings/lib/control_message_handler.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 #include <stdint.h> 8 #include <stdint.h>
9 #include <utility> 9 #include <utility>
10 10
11 #include "base/logging.h" 11 #include "base/logging.h"
12 #include "base/macros.h"
12 #include "mojo/public/cpp/bindings/lib/message_builder.h" 13 #include "mojo/public/cpp/bindings/lib/message_builder.h"
13 #include "mojo/public/cpp/bindings/lib/serialization.h" 14 #include "mojo/public/cpp/bindings/lib/serialization.h"
14 #include "mojo/public/interfaces/bindings/interface_control_messages.mojom.h" 15 #include "mojo/public/interfaces/bindings/interface_control_messages.mojom.h"
15 16
16 namespace mojo { 17 namespace mojo {
17 namespace internal { 18 namespace internal {
18 19
19 // static 20 // static
20 bool ControlMessageHandler::IsControlMessage(const Message* message) { 21 bool ControlMessageHandler::IsControlMessage(const Message* message) {
21 return message->header()->name == kRunMessageId || 22 return message->header()->name == kRunMessageId ||
22 message->header()->name == kRunOrClosePipeMessageId; 23 message->header()->name == kRunOrClosePipeMessageId;
23 } 24 }
24 25
25 ControlMessageHandler::ControlMessageHandler(uint32_t interface_version) 26 ControlMessageHandler::ControlMessageHandler(const char* interface_name,
26 : interface_version_(interface_version) { 27 uint32_t interface_version)
28 : interface_name_(interface_name), interface_version_(interface_version) {
27 } 29 }
28 30
29 ControlMessageHandler::~ControlMessageHandler() { 31 ControlMessageHandler::~ControlMessageHandler() {
30 } 32 }
31 33
32 bool ControlMessageHandler::Accept(Message* message) { 34 MessageReceiver::Result ControlMessageHandler::Accept(Message* message) {
33 if (message->header()->name == kRunOrClosePipeMessageId) 35 if (message->header()->name == kRunOrClosePipeMessageId)
34 return RunOrClosePipe(message); 36 return RunOrClosePipe(message);
35 37
36 NOTREACHED(); 38 NOTREACHED();
37 return false; 39 return Result::ForUnknownError();
38 } 40 }
39 41
40 bool ControlMessageHandler::AcceptWithResponder( 42 MessageReceiver::Result ControlMessageHandler::AcceptWithResponder(
41 Message* message, 43 Message* message,
42 MessageReceiverWithStatus* responder) { 44 MessageReceiverWithStatus* responder) {
43 if (message->header()->name == kRunMessageId) 45 if (message->header()->name == kRunMessageId)
44 return Run(message, responder); 46 return Run(message, responder);
45 47
46 NOTREACHED(); 48 NOTREACHED();
47 return false; 49 return Result::ForUnknownError();
48 } 50 }
49 51
50 bool ControlMessageHandler::Run(Message* message, 52 MessageReceiver::Result ControlMessageHandler::Run(
51 MessageReceiverWithStatus* responder) { 53 Message* message,
54 MessageReceiverWithStatus* responder) {
52 RunResponseMessageParamsPtr response_params_ptr( 55 RunResponseMessageParamsPtr response_params_ptr(
53 RunResponseMessageParams::New()); 56 RunResponseMessageParams::New());
54 response_params_ptr->reserved0 = 16u; 57 response_params_ptr->reserved0 = 16u;
55 response_params_ptr->reserved1 = 0u; 58 response_params_ptr->reserved1 = 0u;
56 response_params_ptr->query_version_result = QueryVersionResult::New(); 59 response_params_ptr->query_version_result = QueryVersionResult::New();
57 response_params_ptr->query_version_result->version = interface_version_; 60 response_params_ptr->query_version_result->version = interface_version_;
58 61
59 size_t size = PrepareToSerialize<RunResponseMessageParamsPtr>( 62 size_t size = PrepareToSerialize<RunResponseMessageParamsPtr>(
60 response_params_ptr, &context_); 63 response_params_ptr, &context_);
61 ResponseMessageBuilder builder(kRunMessageId, size, message->request_id()); 64 ResponseMessageBuilder builder(kRunMessageId, size, message->request_id());
62 65
63 RunResponseMessageParams_Data* response_params = nullptr; 66 RunResponseMessageParams_Data* response_params = nullptr;
64 Serialize<RunResponseMessageParamsPtr>(response_params_ptr, builder.buffer(), 67 Serialize<RunResponseMessageParamsPtr>(response_params_ptr, builder.buffer(),
65 &response_params, &context_); 68 &response_params, &context_);
66 response_params->EncodePointers(); 69 response_params->EncodePointers();
67 bool ok = responder->Accept(builder.message()); 70
68 ALLOW_UNUSED_LOCAL(ok); 71 ignore_result(responder->Accept(builder.message()));
69 delete responder; 72 delete responder;
70 73
71 return true; 74 return Result::ForSuccess();
72 } 75 }
73 76
74 bool ControlMessageHandler::RunOrClosePipe(Message* message) { 77 MessageReceiver::Result ControlMessageHandler::RunOrClosePipe(
78 Message* message) {
75 RunOrClosePipeMessageParams_Data* params = 79 RunOrClosePipeMessageParams_Data* params =
76 reinterpret_cast<RunOrClosePipeMessageParams_Data*>( 80 reinterpret_cast<RunOrClosePipeMessageParams_Data*>(
77 message->mutable_payload()); 81 message->mutable_payload());
78 params->DecodePointers(); 82 params->DecodePointers();
79 83
80 RunOrClosePipeMessageParamsPtr params_ptr; 84 RunOrClosePipeMessageParamsPtr params_ptr;
81 Deserialize<RunOrClosePipeMessageParamsPtr>(params, &params_ptr, &context_); 85 Deserialize<RunOrClosePipeMessageParamsPtr>(params, &params_ptr, &context_);
82 86
83 return interface_version_ >= params_ptr->require_version->version; 87 if (interface_version_ < params_ptr->require_version->version)
88 return Result::ForUnexpectedRequest(interface_name_, message);
89
90 return Result::ForSuccess();
84 } 91 }
85 92
86 } // namespace internal 93 } // namespace internal
87 } // namespace mojo 94 } // namespace mojo
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698