Index: mojo/public/cpp/bindings/lib/array_serialization.h |
diff --git a/mojo/public/cpp/bindings/lib/array_serialization.h b/mojo/public/cpp/bindings/lib/array_serialization.h |
index b6168033b606035fdeb72b8ea0a17213e121c200..8759f6dc7cd33806be31586d4bfb27503f5c1fc3 100644 |
--- a/mojo/public/cpp/bindings/lib/array_serialization.h |
+++ b/mojo/public/cpp/bindings/lib/array_serialization.h |
@@ -30,7 +30,7 @@ inline void SerializeArray_( |
const internal::ArrayValidateParams* validate_params); |
template <typename E, typename F> |
-inline void Deserialize_(internal::Array_Data<F>* data, |
+inline bool Deserialize_(internal::Array_Data<F>* data, |
Array<E>* output, |
internal::SerializationContext* context); |
@@ -62,13 +62,14 @@ struct ArraySerializer<E, F, false> { |
if (input.size()) |
memcpy(output->storage(), &input.storage()[0], input.size() * sizeof(E)); |
} |
- static void DeserializeElements(Array_Data<F>* input, |
+ static bool DeserializeElements(Array_Data<F>* input, |
Array<E>* output, |
SerializationContext* context) { |
std::vector<E> result(input->size()); |
if (input->size()) |
memcpy(&result[0], input->storage(), input->size() * sizeof(E)); |
output->Swap(&result); |
+ return true; |
} |
}; |
@@ -92,7 +93,7 @@ struct ArraySerializer<bool, bool, false> { |
for (size_t i = 0; i < input.size(); ++i) |
output->at(i) = input[i]; |
} |
- static void DeserializeElements(Array_Data<bool>* input, |
+ static bool DeserializeElements(Array_Data<bool>* input, |
Array<bool>* output, |
SerializationContext* context) { |
Array<bool> result(input->size()); |
@@ -100,6 +101,7 @@ struct ArraySerializer<bool, bool, false> { |
for (size_t i = 0; i < input->size(); ++i) |
result.at(i) = input->at(i); |
output->Swap(&result); |
+ return true; |
} |
}; |
@@ -127,13 +129,14 @@ struct ArraySerializer<ScopedHandleBase<H>, H, false> { |
i)); |
} |
} |
- static void DeserializeElements(Array_Data<H>* input, |
+ static bool DeserializeElements(Array_Data<H>* input, |
Array<ScopedHandleBase<H>>* output, |
SerializationContext* context) { |
Array<ScopedHandleBase<H>> result(input->size()); |
for (size_t i = 0; i < input->size(); ++i) |
result.at(i) = MakeScopedHandle(FetchAndReset(&input->at(i))); |
output->Swap(&result); |
+ return true; |
} |
}; |
@@ -171,14 +174,20 @@ struct ArraySerializer< |
input.size(), i)); |
} |
} |
- static void DeserializeElements(Array_Data<S_Data*>* input, |
+ static bool DeserializeElements(Array_Data<S_Data*>* input, |
Array<S>* output, |
SerializationContext* context) { |
+ bool success = true; |
Array<S> result(input->size()); |
for (size_t i = 0; i < input->size(); ++i) { |
- Deserialize_(input->at(i), &result[i], context); |
+ // Note that we rely on complete deserialization taking place in order to |
+ // transfer ownership of all encoded handles. Therefore we don't |
+ // short-circuit on failure here. |
+ if (!Deserialize_(input->at(i), &result[i], context)) |
+ success = false; |
} |
output->Swap(&result); |
+ return success; |
} |
private: |
@@ -244,14 +253,20 @@ struct ArraySerializer<U, U_Data, true> { |
} |
} |
- static void DeserializeElements(Array_Data<U_Data>* input, |
+ static bool DeserializeElements(Array_Data<U_Data>* input, |
Array<U>* output, |
SerializationContext* context) { |
+ bool success = true; |
Array<U> result(input->size()); |
for (size_t i = 0; i < input->size(); ++i) { |
- Deserialize_(&input->at(i), &result[i], context); |
+ // Note that we rely on complete deserialization taking place in order to |
+ // transfer ownership of all encoded handles. Therefore we don't |
+ // short-circuit on failure here. |
+ if (!Deserialize_(&input->at(i), &result[i], context)) |
+ success = false; |
} |
output->Swap(&result); |
+ return success; |
} |
}; |
@@ -288,13 +303,17 @@ struct ArraySerializer<String, String_Data*> { |
input.size(), i)); |
} |
} |
- static void DeserializeElements(Array_Data<String_Data*>* input, |
+ static bool DeserializeElements(Array_Data<String_Data*>* input, |
Array<String>* output, |
SerializationContext* context) { |
Array<String> result(input->size()); |
- for (size_t i = 0; i < input->size(); ++i) |
- Deserialize_(input->at(i), &result[i], context); |
+ for (size_t i = 0; i < input->size(); ++i) { |
+ // It's OK to short-circuit here since string data cannot contain handles. |
+ if (!Deserialize_(input->at(i), &result[i], context)) |
+ return false; |
+ } |
output->Swap(&result); |
+ return true; |
} |
}; |
@@ -336,15 +355,18 @@ inline void SerializeArray_( |
} |
template <typename E, typename F> |
-inline void Deserialize_(internal::Array_Data<F>* input, |
+inline bool Deserialize_(internal::Array_Data<F>* input, |
Array<E>* output, |
internal::SerializationContext* context) { |
if (input) { |
- internal::ArraySerializer<E, F>::DeserializeElements(input, output, |
- context); |
+ if (!internal::ArraySerializer<E, F>::DeserializeElements(input, output, |
+ context)) { |
+ return false; |
+ } |
} else { |
output->reset(); |
} |
+ return true; |
} |
} // namespace mojo |