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 %} |