| Index: mojo/public/cpp/bindings/lib/validation_util.h
|
| diff --git a/mojo/public/cpp/bindings/lib/validation_util.h b/mojo/public/cpp/bindings/lib/validation_util.h
|
| index 59df79f63166a4b93b85af11828196544bd7ac55..521ab5cb46cee55c5763e05234e1bfdf6c36cfb4 100644
|
| --- a/mojo/public/cpp/bindings/lib/validation_util.h
|
| +++ b/mojo/public/cpp/bindings/lib/validation_util.h
|
| @@ -132,6 +132,12 @@ template <typename T>
|
| bool ValidateContainer(const Pointer<T>& input,
|
| ValidationContext* validation_context,
|
| const ContainerValidateParams* validate_params) {
|
| + ValidationContext::ScopedDepthTracker depth_tracker(validation_context);
|
| + if (validation_context->ExceedsMaxDepth()) {
|
| + ReportValidationError(validation_context,
|
| + VALIDATION_ERROR_MAX_RECURSION_DEPTH);
|
| + return false;
|
| + }
|
| return ValidatePointer(input, validation_context) &&
|
| T::Validate(input.Get(), validation_context, validate_params);
|
| }
|
| @@ -139,6 +145,12 @@ bool ValidateContainer(const Pointer<T>& input,
|
| template <typename T>
|
| bool ValidateStruct(const Pointer<T>& input,
|
| ValidationContext* validation_context) {
|
| + ValidationContext::ScopedDepthTracker depth_tracker(validation_context);
|
| + if (validation_context->ExceedsMaxDepth()) {
|
| + ReportValidationError(validation_context,
|
| + VALIDATION_ERROR_MAX_RECURSION_DEPTH);
|
| + return false;
|
| + }
|
| return ValidatePointer(input, validation_context) &&
|
| T::Validate(input.Get(), validation_context);
|
| }
|
| @@ -146,12 +158,24 @@ bool ValidateStruct(const Pointer<T>& input,
|
| template <typename T>
|
| bool ValidateInlinedUnion(const T& input,
|
| ValidationContext* validation_context) {
|
| + ValidationContext::ScopedDepthTracker depth_tracker(validation_context);
|
| + if (validation_context->ExceedsMaxDepth()) {
|
| + ReportValidationError(validation_context,
|
| + VALIDATION_ERROR_MAX_RECURSION_DEPTH);
|
| + return false;
|
| + }
|
| return T::Validate(&input, validation_context, true);
|
| }
|
|
|
| template <typename T>
|
| bool ValidateNonInlinedUnion(const Pointer<T>& input,
|
| ValidationContext* validation_context) {
|
| + ValidationContext::ScopedDepthTracker depth_tracker(validation_context);
|
| + if (validation_context->ExceedsMaxDepth()) {
|
| + ReportValidationError(validation_context,
|
| + VALIDATION_ERROR_MAX_RECURSION_DEPTH);
|
| + return false;
|
| + }
|
| return ValidatePointer(input, validation_context) &&
|
| T::Validate(input.Get(), validation_context, false);
|
| }
|
|
|