From f7b17e1ef08a186c19bdcf20ffcc0576812a335a Mon Sep 17 00:00:00 2001 From: wwwcg Date: Wed, 30 Oct 2024 20:14:00 +0800 Subject: [PATCH] fix(ios): potential thread race in vfs file module --- framework/ios/base/bridge/HippyBridge.h | 2 +- framework/ios/base/bridge/HippyBridge.mm | 17 +++++++++++++---- modules/vfs/ios/HippyFileHandler.h | 4 ++-- modules/vfs/ios/HippyFileHandler.mm | 5 +++-- tests/ios/HippyFileHandlerTest.mm | 19 ++++++++++++------- 5 files changed, 31 insertions(+), 16 deletions(-) diff --git a/framework/ios/base/bridge/HippyBridge.h b/framework/ios/base/bridge/HippyBridge.h index addcc0193..784e1ff3e 100644 --- a/framework/ios/base/bridge/HippyBridge.h +++ b/framework/ios/base/bridge/HippyBridge.h @@ -214,7 +214,7 @@ HIPPY_EXTERN NSString *HippyBridgeModuleNameForClass(Class bridgeModuleClass); @property (nonatomic, copy, readonly) NSArray *bundleURLs; /// Path of sandbox directory -@property (nonatomic, strong) NSString *sandboxDirectory; +@property (nonatomic, copy) NSString *sandboxDirectory; /// Shared data between different rootViews on same bridge. /// Set by HippyRootView when runHippyApplication. diff --git a/framework/ios/base/bridge/HippyBridge.mm b/framework/ios/base/bridge/HippyBridge.mm index 22e30951d..62e8de82d 100644 --- a/framework/ios/base/bridge/HippyBridge.mm +++ b/framework/ios/base/bridge/HippyBridge.mm @@ -192,6 +192,7 @@ static inline void registerLogDelegateToHippyCore() { @implementation HippyBridge +@synthesize sandboxDirectory = _sandboxDirectory; @synthesize imageLoader = _imageLoader; @synthesize imageProviders = _imageProviders; @synthesize startTime = _startTime; @@ -1218,11 +1219,19 @@ static NSString *const hippyOnNightModeChangedParam2 = @"RootViewTag"; [_displayLink registerModuleForFrameUpdates:module withModuleData:moduleData]; } +- (NSString *)sandboxDirectory { + @synchronized (self) { + return _sandboxDirectory; + } +} + - (void)setSandboxDirectory:(NSString *)sandboxDirectory { - if (![_sandboxDirectory isEqual:sandboxDirectory]) { - _sandboxDirectory = sandboxDirectory; - if (sandboxDirectory) { - [self.javaScriptExecutor setSandboxDirectory:sandboxDirectory]; + @synchronized (self) { + if (![_sandboxDirectory isEqual:sandboxDirectory]) { + _sandboxDirectory = sandboxDirectory; + if (sandboxDirectory) { + [self.javaScriptExecutor setSandboxDirectory:sandboxDirectory]; + } } } } diff --git a/modules/vfs/ios/HippyFileHandler.h b/modules/vfs/ios/HippyFileHandler.h index 5d306bc7f..3ca65ee43 100644 --- a/modules/vfs/ios/HippyFileHandler.h +++ b/modules/vfs/ios/HippyFileHandler.h @@ -43,8 +43,8 @@ public: /// Convert relative addresses(such as hpfile://) to absolute paths /// - Parameters: /// - hippyFileUrl: file url - /// - hippySandboxDirectory: sandbox directory of hippy app - static NSURL *AbsoluteURLFromHippyFileURL(NSURL *hippyFileUrl, NSURL *hippySandboxDirectory); + /// - bridge: HippyBridge, use to get sandbox url + static NSURL *AbsoluteURLFromHippyFileURL(NSURL *hippyFileUrl, HippyBridge *bridge); virtual void RequestUntrustedContent(NSURLRequest *request, NSDictionary *extraInfo, diff --git a/modules/vfs/ios/HippyFileHandler.mm b/modules/vfs/ios/HippyFileHandler.mm index f74be7b42..cd308b70c 100644 --- a/modules/vfs/ios/HippyFileHandler.mm +++ b/modules/vfs/ios/HippyFileHandler.mm @@ -41,7 +41,7 @@ void HippyFileHandler::RequestUntrustedContent(std::shared_ptr