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

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

Issue 1800753005: C++ bindings: A struct's Deserialize() now does validation before deserializing. (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: oops, typos Created 4 years, 9 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_serialization_definition.tmpl
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 6ac6a3ea7ab800b3cc6c36cc7b4f17847e995f78..867ed6c8995b2a8f8bd971b9892100e19fd6f328 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
@@ -5,36 +5,66 @@ size_t {{struct.name}}::GetSerializedSize() const {
}
bool {{struct.name}}::Serialize(void* buf,
- size_t buf_size) {
+ size_t buf_size,
+ size_t* bytes_written) {
+ MOJO_DCHECK(buf);
+
mojo::internal::FixedBuffer overlay_buf;
overlay_buf.Initialize(buf, buf_size);
internal::{{struct.name}}_Data* output_ptr;
- if (Serialize_(this, &overlay_buf, &output_ptr) !=
- mojo::internal::ValidationError::NONE) {
+ auto err = Serialize_(this, &overlay_buf, &output_ptr);
+ if (err != mojo::internal::ValidationError::NONE) {
// TODO(vardhan): Once Serialize_() outputs handles that it serialized
// (even partially, if there are failures), we should CHECK fail here if
// handles are non-empty.
+ MOJO_DLOG(ERROR) << "Could not serialize: " <<
+ mojo::internal::ValidationErrorToString(err);
+
+ if (bytes_written)
+ *bytes_written = overlay_buf.BytesUsed();
return false;
}
std::vector<mojo::Handle> handles;
output_ptr->EncodePointersAndHandles(&handles);
-
MOJO_CHECK(handles.empty()) << "Serialize() does not support handles.";
+ if (bytes_written)
+ *bytes_written = overlay_buf.BytesUsed();
return true;
}
-void {{struct.name}}::Deserialize(void* buf) {
+bool {{struct.name}}::Deserialize(void* buf, size_t buf_size) {
viettrungluu 2016/03/23 17:43:53 const void*? Also, can't/shouldn't Deserialize()
vardhan 2016/03/23 23:28:43 discussed offline -- "bytes consumed" is hard to c
+ MOJO_DCHECK(buf);
+
+ mojo::internal::BoundsChecker checker(buf, buf_size, 0);
+ std::string err_str;
+ mojo::internal::ValidationError err =
+ internal::{{struct.name}}_Data::Validate(buf, &checker, &err_str);
+ if (err != mojo::internal::ValidationError::NONE) {
+ MOJO_DLOG(ERROR) << "Deserialization error "
+ << mojo::internal::ValidationErrorToString(err)
+ << ": " << err_str;
+ return false;
+ }
+
+ return DeserializeWithoutValidation(buf, buf_size);
+}
+
+
+bool {{struct.name}}::DeserializeWithoutValidation(void* buf,
viettrungluu 2016/03/23 17:43:53 const void*?
vardhan 2016/03/23 23:28:43 Can't right now because Deserialization is current
+ size_t buf_size) {
+ MOJO_DCHECK(buf);
+
internal::{{struct.name}}_Data* input =
static_cast<internal::{{struct.name}}_Data*>(buf);
-
std::vector<mojo::Handle> handles;
input->DecodePointersAndHandles(&handles);
MOJO_CHECK(handles.empty()) << "Deserialize() does not support handles.";
Deserialize_(input, this);
+ return true;
viettrungluu 2016/03/23 17:43:53 Then why does it return anything at all?
vardhan 2016/03/23 23:28:43 Done.
}
size_t GetSerializedSize_(const {{struct.name}}& input) {

Powered by Google App Engine
This is Rietveld 408576698