From 6860cb077595ec327327c59fb92ba81fd7ba8cbc Mon Sep 17 00:00:00 2001 From: Samuel Susla Date: Sun, 7 Jun 2020 13:15:31 -0700 Subject: [PATCH] Fix KERN_INVALID_ADDRESS in configureNextLayoutAnimation Summary: Changelog: [Internal] The crash is caused by dereferencing invalid pointer. This can happen because `UIManager` can outlive `RCTScheduler` and `Scheduler`. Here we make sure when `Scheduler` is being deconstructed, UIManager's pointer is invalidated. I don't think this is ideal solution but it should fix the crash. Ideally we want the owner of animation delegate to invalidate the pointer. Reviewed By: JoshuaGross Differential Revision: D21922910 fbshipit-source-id: b2a56c1104574cecebaffad1bcbcbff82c1fa0cf --- ReactCommon/fabric/scheduler/Scheduler.cpp | 1 + ReactCommon/fabric/uimanager/UIManager.cpp | 3 +-- ReactCommon/fabric/uimanager/UIManager.h | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/ReactCommon/fabric/scheduler/Scheduler.cpp b/ReactCommon/fabric/scheduler/Scheduler.cpp index 076d269e58..14a4f77086 100644 --- a/ReactCommon/fabric/scheduler/Scheduler.cpp +++ b/ReactCommon/fabric/scheduler/Scheduler.cpp @@ -127,6 +127,7 @@ Scheduler::~Scheduler() { // The thread-safety of this operation is guaranteed by this requirement. uiManager_->setDelegate(nullptr); + uiManager_->setAnimationDelegate(nullptr); // Then, let's verify that the requirement was satisfied. auto surfaceIds = std::vector{}; diff --git a/ReactCommon/fabric/uimanager/UIManager.cpp b/ReactCommon/fabric/uimanager/UIManager.cpp index b4910cee67..f7172002c4 100644 --- a/ReactCommon/fabric/uimanager/UIManager.cpp +++ b/ReactCommon/fabric/uimanager/UIManager.cpp @@ -318,8 +318,7 @@ void UIManager::shadowTreeDidFinishTransaction( #pragma mark - UIManagerAnimationDelegate -void UIManager::setAnimationDelegate( - UIManagerAnimationDelegate *delegate) const { +void UIManager::setAnimationDelegate(UIManagerAnimationDelegate *delegate) { animationDelegate_ = delegate; } diff --git a/ReactCommon/fabric/uimanager/UIManager.h b/ReactCommon/fabric/uimanager/UIManager.h index 543bf97cfa..ab6fdbcca6 100644 --- a/ReactCommon/fabric/uimanager/UIManager.h +++ b/ReactCommon/fabric/uimanager/UIManager.h @@ -46,7 +46,7 @@ class UIManager final : public ShadowTreeDelegate { * The delegate is stored as a raw pointer, so the owner must null * the pointer before being destroyed. */ - void setAnimationDelegate(UIManagerAnimationDelegate *delegate) const; + void setAnimationDelegate(UIManagerAnimationDelegate *delegate); void animationTick(); @@ -140,7 +140,7 @@ class UIManager final : public ShadowTreeDelegate { SharedComponentDescriptorRegistry componentDescriptorRegistry_; UIManagerDelegate *delegate_; - mutable UIManagerAnimationDelegate *animationDelegate_{nullptr}; + UIManagerAnimationDelegate *animationDelegate_{nullptr}; UIManagerBinding *uiManagerBinding_; ShadowTreeRegistry shadowTreeRegistry_{}; };