1*6777b538SAndroid Build Coastguard Worker // Copyright 2019 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker #ifndef BASE_JSON_JSON_COMMON_H_ 6*6777b538SAndroid Build Coastguard Worker #define BASE_JSON_JSON_COMMON_H_ 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard Worker #include <stddef.h> 9*6777b538SAndroid Build Coastguard Worker 10*6777b538SAndroid Build Coastguard Worker #include "base/check_op.h" 11*6777b538SAndroid Build Coastguard Worker #include "base/memory/raw_ptr.h" 12*6777b538SAndroid Build Coastguard Worker 13*6777b538SAndroid Build Coastguard Worker namespace base { 14*6777b538SAndroid Build Coastguard Worker namespace internal { 15*6777b538SAndroid Build Coastguard Worker 16*6777b538SAndroid Build Coastguard Worker // Chosen to support 99.9% of documents found in the wild late 2016. 17*6777b538SAndroid Build Coastguard Worker // http://crbug.com/673263 18*6777b538SAndroid Build Coastguard Worker const size_t kAbsoluteMaxDepth = 200; 19*6777b538SAndroid Build Coastguard Worker 20*6777b538SAndroid Build Coastguard Worker // Simple class that checks for maximum recursion/stack overflow. 21*6777b538SAndroid Build Coastguard Worker class StackMarker { 22*6777b538SAndroid Build Coastguard Worker public: StackMarker(size_t max_depth,size_t * depth)23*6777b538SAndroid Build Coastguard Worker StackMarker(size_t max_depth, size_t* depth) 24*6777b538SAndroid Build Coastguard Worker : max_depth_(max_depth), depth_(depth) { 25*6777b538SAndroid Build Coastguard Worker ++(*depth_); 26*6777b538SAndroid Build Coastguard Worker DCHECK_LE(*depth_, max_depth_); 27*6777b538SAndroid Build Coastguard Worker } 28*6777b538SAndroid Build Coastguard Worker 29*6777b538SAndroid Build Coastguard Worker StackMarker(const StackMarker&) = delete; 30*6777b538SAndroid Build Coastguard Worker StackMarker& operator=(const StackMarker&) = delete; 31*6777b538SAndroid Build Coastguard Worker ~StackMarker()32*6777b538SAndroid Build Coastguard Worker ~StackMarker() { --(*depth_); } 33*6777b538SAndroid Build Coastguard Worker IsTooDeep()34*6777b538SAndroid Build Coastguard Worker bool IsTooDeep() const { return *depth_ >= max_depth_; } 35*6777b538SAndroid Build Coastguard Worker 36*6777b538SAndroid Build Coastguard Worker private: 37*6777b538SAndroid Build Coastguard Worker const size_t max_depth_; 38*6777b538SAndroid Build Coastguard Worker const raw_ptr<size_t> depth_; 39*6777b538SAndroid Build Coastguard Worker }; 40*6777b538SAndroid Build Coastguard Worker 41*6777b538SAndroid Build Coastguard Worker } // namespace internal 42*6777b538SAndroid Build Coastguard Worker } // namespace base 43*6777b538SAndroid Build Coastguard Worker 44*6777b538SAndroid Build Coastguard Worker #endif // BASE_JSON_JSON_COMMON_H_ 45