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

Unified Diff: mojo/public/tools/bindings/generators/cpp_templates/struct_macros.tmpl

Issue 289333002: Mojo cpp bindings: validation logic for incoming messages (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: . Created 6 years, 7 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/struct_macros.tmpl
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 106a18d8c99a5c6bf4db8370f1728921d44363e4..2f8f2df86bf8f720f3464e675a580da14108950a 100644
--- a/mojo/public/tools/bindings/generators/cpp_templates/struct_macros.tmpl
+++ b/mojo/public/tools/bindings/generators/cpp_templates/struct_macros.tmpl
@@ -1,3 +1,37 @@
+{%- macro validate(struct, class_name) %}
+ if (!data)
+ return true;
+
+ if (!ValidateStructHeader(
+ data, sizeof({{class_name}}),
+ {{struct.packed.packed_fields|length}}, bounds_checker)) {
+ return false;
+ }
+
+ const {{class_name}}* MOJO_ALLOW_UNUSED object =
+ static_cast<const {{class_name}}*>(data);
+
+{%- for packed_field in struct.packed.packed_fields
+ if packed_field.field.kind|is_object_kind %}
+{%- set wrapper_type = packed_field.field.kind|cpp_wrapper_type %}
+{%- set name = packed_field.field.name %}
+ if (!mojo::internal::ValidateEncodedPointer(&object->{{name}}_.offset) ||
+ !{{wrapper_type}}::Data::Validate(
+ mojo::internal::DecodePointerRaw(&object->{{name}}_.offset),
+ bounds_checker)) {
+ return false;
+ }
+{%- endfor %}
+{%- for packed_field in struct.packed.packed_fields
+ if packed_field.field.kind|is_handle_kind %}
+{%- set name = packed_field.field.name %}
+ if (!bounds_checker->ClaimHandle(object->{{name}}_))
+ return false;
+{%- endfor %}
+
+ return true;
+{%- endmacro %}
+
{%- macro setters(struct) %}
{% for packed_field in struct.packed.packed_fields %}
{%- set type = packed_field.field.kind|cpp_type %}

Powered by Google App Engine
This is Rietveld 408576698