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

Unified 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 side-by-side diff with in-line comments
Download patch
Index: mojo/public/tools/bindings/generators/cpp_templates/interface_definition.tmpl
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/interface_definition.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/interface_definition.tmpl
index aef7e9d3d78ac3354f1183be91189099eb9fb8b1..2c87b642421040cdeaadf71414045314d5c92dcd 100644
--- a/mojo/public/tools/bindings/generators/cpp_templates/interface_definition.tmpl
+++ b/mojo/public/tools/bindings/generators/cpp_templates/interface_definition.tmpl
@@ -5,7 +5,8 @@
{%- set proxy_name = interface.name ~ "Proxy" %}
{%- set namespace_as_string = "%s"|format(namespace|replace(".","::")) %}
-{%- macro alloc_params(struct, params, message, serialization_context) %}
+{%- macro alloc_params(struct, params, message, error, create_error,
+ method_name, serialization_context) %}
({{params}})->DecodePointers();
({{serialization_context}})->handles.Swap(({{message}})->mutable_handles());
bool success = true;
@@ -15,8 +16,11 @@
{{struct.name}}DataView input_data_view({{params}},
{{serialization_context}});
{{struct_macros.deserialize(struct, "input_data_view", "p_%s", "success")}}
- if (!success)
+ if (!success) {
+ *{{error}} = {{create_error}}("{{class_name}}", "{{method_name}}",
+ {{message}});
return false;
+ }
{%- endmacro %}
{%- macro pass_params(parameters) %}
@@ -82,7 +86,7 @@ class {{class_name}}_{{method.name}}_HandleSyncResponse
{%- endfor %} {
DCHECK(!*result_);
}
- bool Accept(mojo::Message* message) override;
+ bool Accept(mojo::Message* message, mojo::Error* error) override;
private:
mojo::internal::SerializationContext serialization_context_;
bool* result_;
@@ -92,12 +96,13 @@ class {{class_name}}_{{method.name}}_HandleSyncResponse
DISALLOW_COPY_AND_ASSIGN({{class_name}}_{{method.name}}_HandleSyncResponse);
};
bool {{class_name}}_{{method.name}}_HandleSyncResponse::Accept(
- mojo::Message* message) {
+ mojo::Message* message, mojo::Error* error) {
internal::{{class_name}}_{{method.name}}_ResponseParams_Data* params =
reinterpret_cast<internal::{{class_name}}_{{method.name}}_ResponseParams_Data*>(
message->mutable_payload());
- {{alloc_params(method.response_param_struct, "params", "message",
+ {{alloc_params(method.response_param_struct, "params", "message", "error",
+ "mojo::Error::ForBadResponse", method.name,
"&serialization_context_")}}
{%- for param in method.response_parameters %}
@@ -120,19 +125,20 @@ class {{class_name}}_{{method.name}}_ForwardToCallback
scoped_refptr<mojo::internal::MultiplexRouter> router)
: callback_(callback), serialization_context_(std::move(router)) {
}
- bool Accept(mojo::Message* message) override;
+ bool Accept(mojo::Message* message, mojo::Error* error) override;
private:
{{class_name}}::{{method.name}}Callback callback_;
mojo::internal::SerializationContext serialization_context_;
DISALLOW_COPY_AND_ASSIGN({{class_name}}_{{method.name}}_ForwardToCallback);
};
bool {{class_name}}_{{method.name}}_ForwardToCallback::Accept(
- mojo::Message* message) {
+ mojo::Message* message, mojo::Error* error) {
internal::{{class_name}}_{{method.name}}_ResponseParams_Data* params =
reinterpret_cast<internal::{{class_name}}_{{method.name}}_ResponseParams_Data*>(
message->mutable_payload());
- {{alloc_params(method.response_param_struct, "params", "message",
+ {{alloc_params(method.response_param_struct, "params", "message", "error",
+ "mojo::Error::ForBadResponse", method.name,
"&serialization_context_")}}
callback_.Run({{pass_params(method.response_parameters)}});
return true;
@@ -171,8 +177,11 @@ bool {{proxy_name}}::{{method.name}}(
{%- for param in method.response_parameters -%}
, param_{{param.name}}
{%- endfor %});
- if (!receiver_->AcceptWithResponder(builder.message(), responder))
+ mojo::Error send_error;
+ if (!receiver_->AcceptWithResponder(builder.message(), responder,
+ &send_error)) {
delete responder;
+ }
return result;
}
{%- endif %}
@@ -193,11 +202,16 @@ void {{proxy_name}}::{{method.name}}(
{%- if method.response_parameters != None %}
mojo::MessageReceiver* responder =
- new {{class_name}}_{{method.name}}_ForwardToCallback(callback, serialization_context_.router);
- if (!receiver_->AcceptWithResponder(builder.message(), responder))
+ new {{class_name}}_{{method.name}}_ForwardToCallback(
+ callback, serialization_context_.router);
+ mojo::Error send_error;
+ if (!receiver_->AcceptWithResponder(builder.message(), responder,
+ &send_error)) {
delete responder;
+ }
{%- else %}
- bool ok = receiver_->Accept(builder.message());
+ mojo::Error send_response_error;
+ bool ok = receiver_->Accept(builder.message(), &send_response_error);
// This return value may be ignored as !ok implies the Connector has
// encountered an error, which will be visible through other means.
ALLOW_UNUSED_LOCAL(ok);
@@ -261,7 +275,8 @@ void {{class_name}}_{{method.name}}_ProxyToResponder::Run(
is_sync_ ? mojo::internal::kMessageIsSync : 0);
{{build_message(response_params_struct, "in_%s", params_description,
"&serialization_context_")}}
- bool ok = responder_->Accept(builder.message());
+ mojo::Error send_response_error;
+ bool ok = responder_->Accept(builder.message(), &send_response_error);
ALLOW_UNUSED_LOCAL(ok);
// TODO(darin): !ok returned here indicates a malformed message, and that may
// be good reason to close the connection. However, we don't have a way to do
@@ -281,9 +296,9 @@ void {{class_name}}_{{method.name}}_ProxyToResponder::Run(
{#--- Stub definition #}
-bool {{class_name}}Stub::Accept(mojo::Message* message) {
+bool {{class_name}}Stub::Accept(mojo::Message* message, mojo::Error* error) {
if (mojo::internal::ControlMessageHandler::IsControlMessage(message))
- return control_message_handler_.Accept(message);
+ return control_message_handler_.Accept(message, error);
{%- if interface.methods %}
switch (message->header()->name) {
{%- for method in interface.methods %}
@@ -293,7 +308,8 @@ bool {{class_name}}Stub::Accept(mojo::Message* message) {
reinterpret_cast<internal::{{class_name}}_{{method.name}}_Params_Data*>(
message->mutable_payload());
- {{alloc_params(method.param_struct, "params", "message",
+ {{alloc_params(method.param_struct, "params", "message", "error",
+ "mojo::Error::ForBadRequest", method.name,
"&serialization_context_")|indent(4)}}
// A null |sink_| means no implementation was bound.
assert(sink_);
@@ -311,9 +327,13 @@ bool {{class_name}}Stub::Accept(mojo::Message* message) {
}
bool {{class_name}}Stub::AcceptWithResponder(
- mojo::Message* message, mojo::MessageReceiverWithStatus* responder) {
- if (mojo::internal::ControlMessageHandler::IsControlMessage(message))
- return control_message_handler_.AcceptWithResponder(message, responder);
+ mojo::Message* message,
+ mojo::MessageReceiverWithStatus* responder,
+ mojo::Error* error) {
+ if (mojo::internal::ControlMessageHandler::IsControlMessage(message)) {
+ return control_message_handler_.AcceptWithResponder(message, responder,
+ error);
+ }
{%- if interface.methods %}
switch (message->header()->name) {
{%- for method in interface.methods %}
@@ -323,7 +343,8 @@ bool {{class_name}}Stub::AcceptWithResponder(
reinterpret_cast<internal::{{class_name}}_{{method.name}}_Params_Data*>(
message->mutable_payload());
- {{alloc_params(method.param_struct, "params", "message",
+ {{alloc_params(method.param_struct, "params", "message", "error",
+ "mojo::Error::ForBadRequest", method.name,
"&serialization_context_")|indent(4)}}
{{class_name}}::{{method.name}}Callback::Runnable* runnable =
new {{class_name}}_{{method.name}}_ProxyToResponder(
@@ -354,30 +375,41 @@ bool {{class_name}}Stub::AcceptWithResponder(
mojo::MessageReceiver* sink) : MessageFilter(sink) {
}
-bool {{class_name}}RequestValidator::Accept(mojo::Message* message) {
+bool {{class_name}}RequestValidator::Accept(mojo::Message* message,
+ mojo::Error* error) {
assert(sink_);
if (mojo::internal::ControlMessageHandler::IsControlMessage(message)) {
- if (!mojo::internal::ValidateControlRequest(message))
+ if (!mojo::internal::ValidateControlRequest(message)) {
+ *error = mojo::Error::ForBadControlMessage("{{class_name}}", message);
return false;
- return sink_->Accept(message);
+ }
+ return sink_->Accept(message, error);
}
switch (message->header()->name) {
{%- for method in interface.methods %}
case internal::k{{class_name}}_{{method.name}}_Name: {
{%- if method.response_parameters != None %}
- if (!mojo::internal::ValidateMessageIsRequestExpectingResponse(message))
+ if (!mojo::internal::ValidateMessageIsRequestExpectingResponse(message)) {
+ *error = mojo::Error::ForBadRequest(
+ "{{class_name}}", "{{method.name}}", message);
return false;
+ }
{%- else %}
- if (!mojo::internal::ValidateMessageIsRequestWithoutResponse(message))
+ if (!mojo::internal::ValidateMessageIsRequestWithoutResponse(message)) {
+ *error = mojo::Error::ForBadRequest(
+ "{{class_name}}", "{{method.name}}", message);
return false;
+ }
{%- endif %}
if (!mojo::internal::ValidateMessagePayload<
internal::{{class_name}}_{{method.name}}_Params_Data>(message)) {
+ *error = mojo::Error::ForBadRequest(
+ "{{class_name}}", "{{method.name}}", message);
return false;
}
- return sink_->Accept(message);
+ return sink_->Accept(message, error);
}
{%- endfor %}
default:
@@ -396,25 +428,33 @@ bool {{class_name}}RequestValidator::Accept(mojo::Message* message) {
mojo::MessageReceiver* sink) : MessageFilter(sink) {
}
-bool {{class_name}}ResponseValidator::Accept(mojo::Message* message) {
+bool {{class_name}}ResponseValidator::Accept(mojo::Message* message,
+ mojo::Error* error) {
assert(sink_);
if (mojo::internal::ControlMessageHandler::IsControlMessage(message)) {
- if (!mojo::internal::ValidateControlResponse(message))
+ if (!mojo::internal::ValidateControlResponse(message)) {
+ *error = mojo::Error::ForBadControlMessage("{{class_name}}", message);
return false;
- return sink_->Accept(message);
+ }
+ return sink_->Accept(message, error);
}
- if (!mojo::internal::ValidateMessageIsResponse(message))
+ if (!mojo::internal::ValidateMessageIsResponse(message)) {
+ *error = mojo::Error::ForUnexpectedRequest("{{class_name}}", message);
return false;
+ }
switch (message->header()->name) {
{%- for method in interface.methods if method.response_parameters != None %}
case internal::k{{class_name}}_{{method.name}}_Name: {
if (!mojo::internal::ValidateMessagePayload<
- internal::{{class_name}}_{{method.name}}_ResponseParams_Data>(message)) {
+ internal::{{class_name}}_{{method.name}}_ResponseParams_Data>(
+ message)) {
+ *error = mojo::Error::ForBadResponse(
+ "{{class_name}}", "{{method.name}}", message);
return false;
}
- return sink_->Accept(message);
+ return sink_->Accept(message, error);
}
{%- endfor %}
default:
@@ -424,6 +464,7 @@ bool {{class_name}}ResponseValidator::Accept(mojo::Message* message) {
// Unrecognized message.
ReportValidationError(
mojo::internal::VALIDATION_ERROR_MESSAGE_HEADER_UNKNOWN_METHOD);
+ *error = mojo::Error::ForUnexpectedResponse("{{class_name}}", message);
return false;
}
{%- endif -%}

Powered by Google App Engine
This is Rietveld 408576698