summaryrefslogtreecommitdiffstats
path: root/mojo/public/tools/bindings/generators
diff options
context:
space:
mode:
authorrockot <rockot@chromium.org>2015-12-16 19:52:22 -0800
committerCommit bot <commit-bot@chromium.org>2015-12-17 03:53:50 +0000
commit13aa783fb893ac4c3b7977e3dcaee46abaf2cc47 (patch)
treef9dded8925cccaee643d38a48a0d0b8332edca9a /mojo/public/tools/bindings/generators
parent88839a19bc011db3e59cbf9855b32635d6be3d9e (diff)
downloadchromium_src-13aa783fb893ac4c3b7977e3dcaee46abaf2cc47.zip
chromium_src-13aa783fb893ac4c3b7977e3dcaee46abaf2cc47.tar.gz
chromium_src-13aa783fb893ac4c3b7977e3dcaee46abaf2cc47.tar.bz2
[mojo] Allow value deserialization to fail
This changes mojo::Deserialize_ et al to return a bool, opening the door for deserialization code which performs custom validation (in addition to baked-in mojom wire format validation) and may reject incoming messages at the bindings layer. Part of a series of changes to support custom mojom serialization: 1. https://codereview.chromium.org/1515423002 2. https://codereview.chromium.org/1517043004 3. https://codereview.chromium.org/1524693002 4. This CL 5. https://codereview.chromium.org/1524613002 6. https://codereview.chromium.org/1526533002 7. https://codereview.chromium.org/1524703002 BUG=569669 Review URL: https://codereview.chromium.org/1520153002 Cr-Commit-Position: refs/heads/master@{#365728}
Diffstat (limited to 'mojo/public/tools/bindings/generators')
-rw-r--r--mojo/public/tools/bindings/generators/cpp_templates/interface_definition.tmpl7
-rw-r--r--mojo/public/tools/bindings/generators/cpp_templates/struct_macros.tmpl9
-rw-r--r--mojo/public/tools/bindings/generators/cpp_templates/struct_serialization_declaration.tmpl2
-rw-r--r--mojo/public/tools/bindings/generators/cpp_templates/struct_serialization_definition.tmpl6
-rw-r--r--mojo/public/tools/bindings/generators/cpp_templates/union_serialization_declaration.tmpl2
-rw-r--r--mojo/public/tools/bindings/generators/cpp_templates/union_serialization_definition.tmpl7
6 files changed, 22 insertions, 11 deletions
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 9889f8b..a445313 100644
--- a/mojo/public/tools/bindings/generators/cpp_templates/interface_definition.tmpl
+++ b/mojo/public/tools/bindings/generators/cpp_templates/interface_definition.tmpl
@@ -7,10 +7,13 @@
{%- set namespace_as_string = "%s"|format(namespace|replace(".","::")) %}
{%- macro alloc_params(struct, serialization_context) %}
+ bool success = true;
{%- for param in struct.packed.packed_fields_in_ordinal_order %}
{{param.field.kind|cpp_result_type}} p_{{param.field.name}}{};
{%- endfor %}
- {{struct_macros.deserialize(struct, "params", "p_%s", serialization_context)}}
+ {{struct_macros.deserialize(struct, "params", "p_%s", serialization_context, "success")}}
+ if (!success)
+ return false;
{%- endmacro %}
{%- macro pass_params(parameters) %}
@@ -224,11 +227,11 @@ bool {{class_name}}Stub::AcceptWithResponder(
message->mutable_payload());
params->DecodePointersAndHandles(message->mutable_handles());
+ {{alloc_params(method.param_struct, "&serialization_context_")|indent(4)}}
{{class_name}}::{{method.name}}Callback::Runnable* runnable =
new {{class_name}}_{{method.name}}_ProxyToResponder(
message->request_id(), responder);
{{class_name}}::{{method.name}}Callback callback(runnable);
- {{alloc_params(method.param_struct, "&serialization_context_")|indent(4)}}
// A null |sink_| means no implementation was bound.
assert(sink_);
TRACE_EVENT0("mojom", "{{class_name}}::{{method.name}}");
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/struct_macros.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/struct_macros.tmpl
index f28948a..0898949 100644
--- a/mojo/public/tools/bindings/generators/cpp_templates/struct_macros.tmpl
+++ b/mojo/public/tools/bindings/generators/cpp_templates/struct_macros.tmpl
@@ -113,7 +113,8 @@
- method parameters/response parameters: the output is a list of
arguments. #}
|context| is the name of the serialization context.
-{%- macro deserialize(struct, input, output_field_pattern, context) -%}
+ |success| is the name of a bool variable to track success of the operation.
+{%- macro deserialize(struct, input, output_field_pattern, context, success) -%}
do {
// NOTE: The memory backing |{{input}}| may has be smaller than
// |sizeof(*{{input}})| if the message comes from an older version.
@@ -133,9 +134,11 @@
{%- endif %}
{%- if kind|is_object_kind %}
{%- if kind|is_union_kind %}
- Deserialize_(&{{input}}->{{name}}, &{{output_field}}, {{context}});
+ if (!Deserialize_(&{{input}}->{{name}}, &{{output_field}}, {{context}}))
+ {{success}} = false;
{%- else %}
- Deserialize_({{input}}->{{name}}.ptr, &{{output_field}}, {{context}});
+ if (!Deserialize_({{input}}->{{name}}.ptr, &{{output_field}}, {{context}}))
+ {{success}} = false;
{%- endif %}
{%- elif kind|is_interface_kind %}
mojo::internal::InterfaceDataToPointer(&{{input}}->{{name}}, &{{output_field}});
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/struct_serialization_declaration.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/struct_serialization_declaration.tmpl
index 1f02481..5ded622 100644
--- a/mojo/public/tools/bindings/generators/cpp_templates/struct_serialization_declaration.tmpl
+++ b/mojo/public/tools/bindings/generators/cpp_templates/struct_serialization_declaration.tmpl
@@ -1,6 +1,6 @@
size_t GetSerializedSize_(const {{struct.name}}Ptr& input);
void Serialize_({{struct.name}}Ptr input, mojo::internal::Buffer* buffer,
internal::{{struct.name}}_Data** output);
-void Deserialize_(internal::{{struct.name}}_Data* input,
+bool Deserialize_(internal::{{struct.name}}_Data* input,
{{struct.name}}Ptr* output,
mojo::internal::SerializationContext* context);
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/struct_serialization_definition.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/struct_serialization_definition.tmpl
index 24cc767..5c14ea0 100644
--- a/mojo/public/tools/bindings/generators/cpp_templates/struct_serialization_definition.tmpl
+++ b/mojo/public/tools/bindings/generators/cpp_templates/struct_serialization_definition.tmpl
@@ -16,14 +16,16 @@ void Serialize_({{struct.name}}Ptr input, mojo::internal::Buffer* buf,
}
}
-void Deserialize_(internal::{{struct.name}}_Data* input,
+bool Deserialize_(internal::{{struct.name}}_Data* input,
{{struct.name}}Ptr* output,
mojo::internal::SerializationContext* context) {
+ bool success = true;
if (input) {
{{struct.name}}Ptr result({{struct.name}}::New());
- {{struct_macros.deserialize(struct, "input", "result->%s", "context")|indent(2)}}
+ {{struct_macros.deserialize(struct, "input", "result->%s", "context", "success")|indent(2)}}
*output = result.Pass();
} else {
output->reset();
}
+ return success;
}
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/union_serialization_declaration.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/union_serialization_declaration.tmpl
index 6773486..3604763 100644
--- a/mojo/public/tools/bindings/generators/cpp_templates/union_serialization_declaration.tmpl
+++ b/mojo/public/tools/bindings/generators/cpp_templates/union_serialization_declaration.tmpl
@@ -1,6 +1,6 @@
size_t GetSerializedSize_(const {{union.name}}Ptr& input, bool inlined);
void SerializeUnion_({{union.name}}Ptr input, mojo::internal::Buffer* buffer,
internal::{{union.name}}_Data** output, bool inlined);
-void Deserialize_(internal::{{union.name}}_Data* input,
+bool Deserialize_(internal::{{union.name}}_Data* input,
{{union.name}}Ptr* output,
mojo::internal::SerializationContext* context);
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/union_serialization_definition.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/union_serialization_definition.tmpl
index 3471932..73f6c95 100644
--- a/mojo/public/tools/bindings/generators/cpp_templates/union_serialization_definition.tmpl
+++ b/mojo/public/tools/bindings/generators/cpp_templates/union_serialization_definition.tmpl
@@ -93,9 +93,10 @@ void SerializeUnion_({{union.name}}Ptr input, mojo::internal::Buffer* buf,
*output = result;
}
-void Deserialize_(internal::{{union.name}}_Data* input,
+bool Deserialize_(internal::{{union.name}}_Data* input,
{{union.name}}Ptr* output,
mojo::internal::SerializationContext* context) {
+ bool success = true;
if (input && !input->is_null()) {
{{union.name}}Ptr result({{union.name}}::New());
mojo::internal::UnionAccessor<{{union.name}}> result_acc(result.get());
@@ -104,7 +105,8 @@ void Deserialize_(internal::{{union.name}}_Data* input,
case {{union.name}}::Tag::{{field.name|upper}}: {
{% if field.kind|is_object_kind %}
result_acc.SwitchActive({{union.name}}::Tag::{{field.name|upper}});
- Deserialize_(input->data.f_{{field.name}}.ptr, result_acc.data()->{{field.name}}, context);
+ if (!Deserialize_(input->data.f_{{field.name}}.ptr, result_acc.data()->{{field.name}}, context))
+ success = false;
{% elif field.kind|is_any_handle_kind %}
{{field.kind|cpp_wrapper_type}}* {{field.name}} =
reinterpret_cast<{{field.kind|cpp_wrapper_type}}*>(&input->data.f_{{field.name}});
@@ -132,4 +134,5 @@ void Deserialize_(internal::{{union.name}}_Data* input,
} else {
output->reset();
}
+ return success;
}