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
This commit is contained in:
Mehdi Mulani 2016-10-27 09:17:22 -07:00 committed by Facebook Github Bot
parent aa4428cd13
commit 97153d68cf
1 changed files with 27 additions and 0 deletions

View File

@ -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
{