From 97153d68cf64c8fd8c8b01aa6da65c8a8eab3209 Mon Sep 17 00:00:00 2001 From: Mehdi Mulani Date: Thu, 27 Oct 2016 09:17:22 -0700 Subject: [PATCH] Guard against bad values set in RCTCustomScrollView Summary: UIScrollView's internal logic with scroll indicator dies when bad values (e.g. NaN/Infinity) are set on the position/size. We already guard UIManager with these checks but the RCTScrollView's underlying scrollview (RCTCustomScrollView) can get these set from other places, and we're seeing crashes in this area. Reviewed By: javache Differential Revision: D4088601 fbshipit-source-id: b1185cc7c65ba0266787441169264c94338fc55c --- React/Views/RCTScrollView.m | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/React/Views/RCTScrollView.m b/React/Views/RCTScrollView.m index 47c007928..f3ea08854 100644 --- a/React/Views/RCTScrollView.m +++ b/React/Views/RCTScrollView.m @@ -364,6 +364,33 @@ RCT_NOT_IMPLEMENTED(- (instancetype)init) return [super hitTest:point withEvent:event]; } +static inline BOOL isRectInvalid(CGRect rect) { + return isnan(rect.origin.x) || isinf(rect.origin.x) || + isnan(rect.origin.y) || isinf(rect.origin.y) || + isnan(rect.size.width) || isinf(rect.size.width) || + isnan(rect.size.height) || isinf(rect.size.height); +} + +- (void)setBounds:(CGRect)bounds +{ + if (isRectInvalid(bounds)) { + RCTLogError(@"Attempted to set an invalid bounds to inner scrollview: %@", NSStringFromCGRect(bounds)); + return; + } + + [super setBounds:bounds]; +} + +- (void)setFrame:(CGRect)frame +{ + if (isRectInvalid(frame)) { + RCTLogError(@"Attempted to set an invalid frame to inner scrollview: %@", NSStringFromCGRect(frame)); + return; + } + + [super setFrame:frame]; +} + #if !TARGET_OS_TV - (void)setRctRefreshControl:(RCTRefreshControl *)refreshControl {