mirror of
https://github.com/facebook/react-native.git
synced 2024-11-21 12:39:27 +00:00
Potentially fix seg fault when replace YogaLayoutableShadowNodes (#47689)
Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/47689 We were seeing some segfaults from trying to access `display_` in Yoga's `replaceChild` function. Some memory debugging helped identify this was a use-after-free error and NickGerleman suggested we try swapping these lines. Logic being the shared_ptr of YogaLayoutableShadowNode is replaced right before we go and replace its yoga node in the yoga tree. If this is the last shared_ptr holding this node we will delete this object and thus the yoga node with it. We do not need to do this first, so let's swap the lines. Changelog: [Internal] Reviewed By: NickGerleman Differential Revision: D66142356 fbshipit-source-id: 8fd835346edc91e045ed2ee8945a95af21c47556
This commit is contained in:
parent
fa65b937f5
commit
156454ef39
@ -300,13 +300,13 @@ void YogaLayoutableShadowNode::replaceChild(
|
||||
// Both children are layoutable, replace the old one with the new one
|
||||
react_native_assert(layoutableNewChild->yogaNode_.getOwner() == nullptr);
|
||||
layoutableNewChild->yogaNode_.setOwner(&yogaNode_);
|
||||
*oldChildIter = layoutableNewChild;
|
||||
yogaNode_.replaceChild(&layoutableNewChild->yogaNode_, oldChildIndex);
|
||||
*oldChildIter = layoutableNewChild;
|
||||
} else {
|
||||
// Layoutable child replaced with non layoutable child. Remove the previous
|
||||
// child from the layoutable children list.
|
||||
yogaLayoutableChildren_.erase(oldChildIter);
|
||||
yogaNode_.removeChild(oldChildIndex);
|
||||
yogaLayoutableChildren_.erase(oldChildIter);
|
||||
}
|
||||
|
||||
ensureYogaChildrenLookFine();
|
||||
|
Loading…
Reference in New Issue
Block a user