diff options
author | rockot <rockot@chromium.org> | 2015-12-16 19:52:22 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-12-17 03:53:50 +0000 |
commit | 13aa783fb893ac4c3b7977e3dcaee46abaf2cc47 (patch) | |
tree | f9dded8925cccaee643d38a48a0d0b8332edca9a /mojo/public/tools/bindings/generators | |
parent | 88839a19bc011db3e59cbf9855b32635d6be3d9e (diff) | |
download | chromium_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')
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; } |