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

Side by Side Diff: mojo/public/tools/bindings/generators/cpp_templates/interface_definition.tmpl

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 {%- import "interface_macros.tmpl" as interface_macros %} 1 {%- import "interface_macros.tmpl" as interface_macros %}
2 {%- import "struct_macros.tmpl" as struct_macros %} 2 {%- import "struct_macros.tmpl" as struct_macros %}
3 3
4 {%- set class_name = interface.name %} 4 {%- set class_name = interface.name %}
5 {%- set proxy_name = interface.name ~ "Proxy" %} 5 {%- set proxy_name = interface.name ~ "Proxy" %}
6 {%- set namespace_as_string = "%s"|format(namespace|replace(".","::")) %} 6 {%- set namespace_as_string = "%s"|format(namespace|replace(".","::")) %}
7 7
8 {%- macro alloc_params(struct, params, message, serialization_context) %} 8 {%- macro alloc_params(struct, params, message, serialization_context,
9 description) %}
9 ({{params}})->DecodePointers(); 10 ({{params}})->DecodePointers();
10 ({{serialization_context}})->handles.Swap(({{message}})->mutable_handles()); 11 ({{serialization_context}})->handles.Swap(({{message}})->mutable_handles());
11 bool success = true; 12 bool success = true;
12 {%- for param in struct.packed.packed_fields_in_ordinal_order %} 13 {%- for param in struct.packed.packed_fields_in_ordinal_order %}
13 {{param.field.kind|cpp_wrapper_type}} p_{{param.field.name}}{}; 14 {{param.field.kind|cpp_wrapper_type}} p_{{param.field.name}}{};
14 {%- endfor %} 15 {%- endfor %}
15 {{struct.name}}DataView input_data_view({{params}}, 16 {{struct.name}}DataView input_data_view({{params}},
16 {{serialization_context}}); 17 {{serialization_context}});
17 {{struct_macros.deserialize(struct, "input_data_view", "p_%s", "success")}} 18 {{struct_macros.deserialize(struct, "input_data_view", "p_%s", "success")}}
18 if (!success) 19 mojo::internal::ValidationContext validation_context(
yzshen1 2016/06/15 22:20:09 Please create this context inside the "if (!succes
Ken Rockot(use gerrit already) 2016/06/15 22:38:23 Done
20 {{message}}->data(), {{message}}->data_num_bytes(),
21 {{message}}->handles()->size(), {{message}},
22 "{{description}} deserializer");
23 if (!success) {
24 ReportValidationError(
25 &validation_context,
26 mojo::internal::VALIDATION_ERROR_DESERIALIZATION_FAILED);
19 return false; 27 return false;
28 }
20 {%- endmacro %} 29 {%- endmacro %}
21 30
22 {%- macro pass_params(parameters) %} 31 {%- macro pass_params(parameters) %}
23 {%- for param in parameters %} 32 {%- for param in parameters %}
24 {%- if param.kind|is_move_only_kind -%} 33 {%- if param.kind|is_move_only_kind -%}
25 std::move(p_{{param.name}}) 34 std::move(p_{{param.name}})
26 {%- else -%} 35 {%- else -%}
27 p_{{param.name}} 36 p_{{param.name}}
28 {%- endif -%} 37 {%- endif -%}
29 {%- if not loop.last %}, {% endif %} 38 {%- if not loop.last %}, {% endif %}
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
91 {%- endfor -%} 100 {%- endfor -%}
92 DISALLOW_COPY_AND_ASSIGN({{class_name}}_{{method.name}}_HandleSyncResponse); 101 DISALLOW_COPY_AND_ASSIGN({{class_name}}_{{method.name}}_HandleSyncResponse);
93 }; 102 };
94 bool {{class_name}}_{{method.name}}_HandleSyncResponse::Accept( 103 bool {{class_name}}_{{method.name}}_HandleSyncResponse::Accept(
95 mojo::Message* message) { 104 mojo::Message* message) {
96 internal::{{class_name}}_{{method.name}}_ResponseParams_Data* params = 105 internal::{{class_name}}_{{method.name}}_ResponseParams_Data* params =
97 reinterpret_cast<internal::{{class_name}}_{{method.name}}_ResponseParams_D ata*>( 106 reinterpret_cast<internal::{{class_name}}_{{method.name}}_ResponseParams_D ata*>(
98 message->mutable_payload()); 107 message->mutable_payload());
99 108
100 {{alloc_params(method.response_param_struct, "params", "message", 109 {{alloc_params(method.response_param_struct, "params", "message",
101 "&serialization_context_")}} 110 "&serialization_context_",
111 "{{class_name}}::{{method.name}} response")}}
102 112
103 {%- for param in method.response_parameters %} 113 {%- for param in method.response_parameters %}
104 {%- if param.kind|is_move_only_kind %} 114 {%- if param.kind|is_move_only_kind %}
105 *out_{{param.name}}_ = std::move(p_{{param.name}}); 115 *out_{{param.name}}_ = std::move(p_{{param.name}});
106 {%- else %} 116 {%- else %}
107 *out_{{param.name}}_ = p_{{param.name}}; 117 *out_{{param.name}}_ = p_{{param.name}};
108 {%- endif %} 118 {%- endif %}
109 {%- endfor %} 119 {%- endfor %}
110 *result_ = true; 120 *result_ = true;
111 return true; 121 return true;
(...skipping 14 matching lines...) Expand all
126 mojo::internal::SerializationContext serialization_context_; 136 mojo::internal::SerializationContext serialization_context_;
127 DISALLOW_COPY_AND_ASSIGN({{class_name}}_{{method.name}}_ForwardToCallback); 137 DISALLOW_COPY_AND_ASSIGN({{class_name}}_{{method.name}}_ForwardToCallback);
128 }; 138 };
129 bool {{class_name}}_{{method.name}}_ForwardToCallback::Accept( 139 bool {{class_name}}_{{method.name}}_ForwardToCallback::Accept(
130 mojo::Message* message) { 140 mojo::Message* message) {
131 internal::{{class_name}}_{{method.name}}_ResponseParams_Data* params = 141 internal::{{class_name}}_{{method.name}}_ResponseParams_Data* params =
132 reinterpret_cast<internal::{{class_name}}_{{method.name}}_ResponseParams_D ata*>( 142 reinterpret_cast<internal::{{class_name}}_{{method.name}}_ResponseParams_D ata*>(
133 message->mutable_payload()); 143 message->mutable_payload());
134 144
135 {{alloc_params(method.response_param_struct, "params", "message", 145 {{alloc_params(method.response_param_struct, "params", "message",
136 "&serialization_context_")}} 146 "&serialization_context_",
147 "{{class_name}}_{{method.name}} response")}}
137 callback_.Run({{pass_params(method.response_parameters)}}); 148 callback_.Run({{pass_params(method.response_parameters)}});
138 return true; 149 return true;
139 } 150 }
140 {%- endif %} 151 {%- endif %}
141 {%- endfor %} 152 {%- endfor %}
142 153
143 {{proxy_name}}::{{proxy_name}}(mojo::MessageReceiverWithResponder* receiver) 154 {{proxy_name}}::{{proxy_name}}(mojo::MessageReceiverWithResponder* receiver)
144 : ControlMessageProxy(receiver) { 155 : ControlMessageProxy(receiver) {
145 } 156 }
146 157
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after
287 {%- if interface.methods %} 298 {%- if interface.methods %}
288 switch (message->header()->name) { 299 switch (message->header()->name) {
289 {%- for method in interface.methods %} 300 {%- for method in interface.methods %}
290 case internal::k{{class_name}}_{{method.name}}_Name: { 301 case internal::k{{class_name}}_{{method.name}}_Name: {
291 {%- if method.response_parameters == None %} 302 {%- if method.response_parameters == None %}
292 internal::{{class_name}}_{{method.name}}_Params_Data* params = 303 internal::{{class_name}}_{{method.name}}_Params_Data* params =
293 reinterpret_cast<internal::{{class_name}}_{{method.name}}_Params_Data* >( 304 reinterpret_cast<internal::{{class_name}}_{{method.name}}_Params_Data* >(
294 message->mutable_payload()); 305 message->mutable_payload());
295 306
296 {{alloc_params(method.param_struct, "params", "message", 307 {{alloc_params(method.param_struct, "params", "message",
297 "&serialization_context_")|indent(4)}} 308 "&serialization_context_", "{{class_name}}::{{method.name}}")
309 |indent(4)}}
298 // A null |sink_| means no implementation was bound. 310 // A null |sink_| means no implementation was bound.
299 assert(sink_); 311 assert(sink_);
300 TRACE_EVENT0("mojom", "{{class_name}}::{{method.name}}"); 312 TRACE_EVENT0("mojom", "{{class_name}}::{{method.name}}");
301 sink_->{{method.name}}({{pass_params(method.parameters)}}); 313 sink_->{{method.name}}({{pass_params(method.parameters)}});
302 return true; 314 return true;
303 {%- else %} 315 {%- else %}
304 break; 316 break;
305 {%- endif %} 317 {%- endif %}
306 } 318 }
307 {%- endfor %} 319 {%- endfor %}
308 } 320 }
309 {%- endif %} 321 {%- endif %}
310 return false; 322 return false;
311 } 323 }
312 324
313 bool {{class_name}}Stub::AcceptWithResponder( 325 bool {{class_name}}Stub::AcceptWithResponder(
314 mojo::Message* message, mojo::MessageReceiverWithStatus* responder) { 326 mojo::Message* message, mojo::MessageReceiverWithStatus* responder) {
315 if (mojo::internal::ControlMessageHandler::IsControlMessage(message)) 327 if (mojo::internal::ControlMessageHandler::IsControlMessage(message))
316 return control_message_handler_.AcceptWithResponder(message, responder); 328 return control_message_handler_.AcceptWithResponder(message, responder);
317 {%- if interface.methods %} 329 {%- if interface.methods %}
318 switch (message->header()->name) { 330 switch (message->header()->name) {
319 {%- for method in interface.methods %} 331 {%- for method in interface.methods %}
320 case internal::k{{class_name}}_{{method.name}}_Name: { 332 case internal::k{{class_name}}_{{method.name}}_Name: {
321 {%- if method.response_parameters != None %} 333 {%- if method.response_parameters != None %}
322 internal::{{class_name}}_{{method.name}}_Params_Data* params = 334 internal::{{class_name}}_{{method.name}}_Params_Data* params =
323 reinterpret_cast<internal::{{class_name}}_{{method.name}}_Params_Data* >( 335 reinterpret_cast<internal::{{class_name}}_{{method.name}}_Params_Data* >(
324 message->mutable_payload()); 336 message->mutable_payload());
325 337
326 {{alloc_params(method.param_struct, "params", "message", 338 {{alloc_params(method.param_struct, "params", "message",
327 "&serialization_context_")|indent(4)}} 339 "&serialization_context_", "{{class_name}}::{{method.name}}")|
340 indent(4)}}
328 {{class_name}}::{{method.name}}Callback::Runnable* runnable = 341 {{class_name}}::{{method.name}}Callback::Runnable* runnable =
329 new {{class_name}}_{{method.name}}_ProxyToResponder( 342 new {{class_name}}_{{method.name}}_ProxyToResponder(
330 message->request_id(), 343 message->request_id(),
331 message->has_flag(mojo::internal::kMessageIsSync), 344 message->has_flag(mojo::internal::kMessageIsSync),
332 responder, 345 responder,
333 serialization_context_.router); 346 serialization_context_.router);
334 {{class_name}}::{{method.name}}Callback callback(runnable); 347 {{class_name}}::{{method.name}}Callback callback(runnable);
335 // A null |sink_| means no implementation was bound. 348 // A null |sink_| means no implementation was bound.
336 assert(sink_); 349 assert(sink_);
337 TRACE_EVENT0("mojom", "{{class_name}}::{{method.name}}"); 350 TRACE_EVENT0("mojom", "{{class_name}}::{{method.name}}");
(...skipping 12 matching lines...) Expand all
350 363
351 {#--- Request validator definitions #} 364 {#--- Request validator definitions #}
352 365
353 {{class_name}}RequestValidator::{{class_name}}RequestValidator( 366 {{class_name}}RequestValidator::{{class_name}}RequestValidator(
354 mojo::MessageReceiver* sink) : MessageFilter(sink) { 367 mojo::MessageReceiver* sink) : MessageFilter(sink) {
355 } 368 }
356 369
357 bool {{class_name}}RequestValidator::Accept(mojo::Message* message) { 370 bool {{class_name}}RequestValidator::Accept(mojo::Message* message) {
358 assert(sink_); 371 assert(sink_);
359 372
373 mojo::internal::ValidationContext validation_context(
374 message->data(), message->data_num_bytes(), message->handles()->size(),
375 message, "{{class_name}} RequestValidator");
376
360 if (mojo::internal::ControlMessageHandler::IsControlMessage(message)) { 377 if (mojo::internal::ControlMessageHandler::IsControlMessage(message)) {
361 if (!mojo::internal::ValidateControlRequest(message)) 378 if (!mojo::internal::ValidateControlRequest(message, &validation_context))
362 return false; 379 return false;
363 return sink_->Accept(message); 380 return sink_->Accept(message);
364 } 381 }
365 382
366 switch (message->header()->name) { 383 switch (message->header()->name) {
367 {%- for method in interface.methods %} 384 {%- for method in interface.methods %}
368 case internal::k{{class_name}}_{{method.name}}_Name: { 385 case internal::k{{class_name}}_{{method.name}}_Name: {
369 {%- if method.response_parameters != None %} 386 {%- if method.response_parameters != None %}
370 if (!mojo::internal::ValidateMessageIsRequestExpectingResponse(message)) 387 if (!mojo::internal::ValidateMessageIsRequestExpectingResponse(
388 message, &validation_context)) {
371 return false; 389 return false;
390 }
372 {%- else %} 391 {%- else %}
373 if (!mojo::internal::ValidateMessageIsRequestWithoutResponse(message)) 392 if (!mojo::internal::ValidateMessageIsRequestWithoutResponse(
393 message, &validation_context)) {
374 return false; 394 return false;
395 }
375 {%- endif %} 396 {%- endif %}
376 if (!mojo::internal::ValidateMessagePayload< 397 if (!mojo::internal::ValidateMessagePayload<
377 internal::{{class_name}}_{{method.name}}_Params_Data>(message)) { 398 internal::{{class_name}}_{{method.name}}_Params_Data>(
399 message, &validation_context)) {
378 return false; 400 return false;
379 } 401 }
380 return sink_->Accept(message); 402 return sink_->Accept(message);
381 } 403 }
382 {%- endfor %} 404 {%- endfor %}
383 default: 405 default:
384 break; 406 break;
385 } 407 }
386 408
387 // Unrecognized message. 409 // Unrecognized message.
388 ReportValidationError( 410 ReportValidationError(
411 &validation_context,
389 mojo::internal::VALIDATION_ERROR_MESSAGE_HEADER_UNKNOWN_METHOD); 412 mojo::internal::VALIDATION_ERROR_MESSAGE_HEADER_UNKNOWN_METHOD);
390 return false; 413 return false;
391 } 414 }
392 415
393 {#--- Response validator definitions #} 416 {#--- Response validator definitions #}
394 {% if interface|has_callbacks %} 417 {% if interface|has_callbacks %}
395 {{class_name}}ResponseValidator::{{class_name}}ResponseValidator( 418 {{class_name}}ResponseValidator::{{class_name}}ResponseValidator(
396 mojo::MessageReceiver* sink) : MessageFilter(sink) { 419 mojo::MessageReceiver* sink) : MessageFilter(sink) {
397 } 420 }
398 421
399 bool {{class_name}}ResponseValidator::Accept(mojo::Message* message) { 422 bool {{class_name}}ResponseValidator::Accept(mojo::Message* message) {
400 assert(sink_); 423 assert(sink_);
401 424
425 mojo::internal::ValidationContext validation_context(
426 message->data(), message->data_num_bytes(), message->handles()->size(),
427 message, "{{class_name}} ResponseValidator");
428
402 if (mojo::internal::ControlMessageHandler::IsControlMessage(message)) { 429 if (mojo::internal::ControlMessageHandler::IsControlMessage(message)) {
403 if (!mojo::internal::ValidateControlResponse(message)) 430 if (!mojo::internal::ValidateControlResponse(message, &validation_context))
404 return false; 431 return false;
405 return sink_->Accept(message); 432 return sink_->Accept(message);
406 } 433 }
407 434
408 if (!mojo::internal::ValidateMessageIsResponse(message)) 435 if (!mojo::internal::ValidateMessageIsResponse(message, &validation_context))
409 return false; 436 return false;
410 switch (message->header()->name) { 437 switch (message->header()->name) {
411 {%- for method in interface.methods if method.response_parameters != None %} 438 {%- for method in interface.methods if method.response_parameters != None %}
412 case internal::k{{class_name}}_{{method.name}}_Name: { 439 case internal::k{{class_name}}_{{method.name}}_Name: {
413 if (!mojo::internal::ValidateMessagePayload< 440 if (!mojo::internal::ValidateMessagePayload<
414 internal::{{class_name}}_{{method.name}}_ResponseParams_Data>(mes sage)) { 441 internal::{{class_name}}_{{method.name}}_ResponseParams_Data>(
442 message, &validation_context)) {
415 return false; 443 return false;
416 } 444 }
417 return sink_->Accept(message); 445 return sink_->Accept(message);
418 } 446 }
419 {%- endfor %} 447 {%- endfor %}
420 default: 448 default:
421 break; 449 break;
422 } 450 }
423 451
424 // Unrecognized message. 452 // Unrecognized message.
425 ReportValidationError( 453 ReportValidationError(
454 &validation_context,
426 mojo::internal::VALIDATION_ERROR_MESSAGE_HEADER_UNKNOWN_METHOD); 455 mojo::internal::VALIDATION_ERROR_MESSAGE_HEADER_UNKNOWN_METHOD);
427 return false; 456 return false;
428 } 457 }
429 {%- endif -%} 458 {%- endif -%}
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698