From 2e6e81e66b2ccebd0ae19ac3140830beaa2d37aa Mon Sep 17 00:00:00 2001 From: rcancro <@pinterest.com> Date: Wed, 16 Dec 2015 15:34:30 -0800 Subject: [PATCH] Don't allow unitialized or under constrained layouts cause a crash. Should I move the pixel bounds rounding to here instead of leaving it in ASLayout? --- AsyncDisplayKit/ASDisplayNode.mm | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/AsyncDisplayKit/ASDisplayNode.mm b/AsyncDisplayKit/ASDisplayNode.mm index 0ca022172e..7758561d96 100644 --- a/AsyncDisplayKit/ASDisplayNode.mm +++ b/AsyncDisplayKit/ASDisplayNode.mm @@ -1816,8 +1816,28 @@ void recursivelyEnsureDisplayForLayer(CALayer *layer) CGRect subnodeFrame = CGRectZero; for (ASLayout *subnodeLayout in _layout.sublayouts) { ASDisplayNodeAssert([_subnodes containsObject:subnodeLayout.layoutableObject], @"Cached sublayouts must only contain subnodes' layout."); - subnodeFrame.origin = subnodeLayout.position; - subnodeFrame.size = subnodeLayout.size; + CGPoint adjustedOrigin = subnodeLayout.position; + if (isfinite(adjustedOrigin.x) == NO) { + ASDisplayNodeAssert(0, @"subnodeLayout has an invalid position"); + adjustedOrigin.x = 0; + } + if (isfinite(adjustedOrigin.y) == NO) { + ASDisplayNodeAssert(0, @"subnodeLayout has an invalid position"); + adjustedOrigin.y = 0; + } + subnodeFrame.origin = adjustedOrigin; + + CGSize adjustedSize = subnodeLayout.size; + if (isfinite(adjustedSize.width) == NO) { + ASDisplayNodeAssert(0, @"subnodeLayout has an invalid size"); + adjustedSize.width = 0; + } + if (isfinite(adjustedSize.height) == NO) { + ASDisplayNodeAssert(0, @"subnodeLayout has an invalid position"); + adjustedSize.height = 0; + } + subnodeFrame.size = adjustedSize; + subnode = ((ASDisplayNode *)subnodeLayout.layoutableObject); [subnode setFrame:subnodeFrame]; }