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); |
} |