diff --git a/sdk/objc/api/peerconnection/RTCFieldTrials.mm b/sdk/objc/api/peerconnection/RTCFieldTrials.mm index 7f1f9993cb..540493570c 100644 --- a/sdk/objc/api/peerconnection/RTCFieldTrials.mm +++ b/sdk/objc/api/peerconnection/RTCFieldTrials.mm @@ -12,6 +12,7 @@ #import #include +#include #import "base/RTCLogging.h" #include "system_wrappers/include/field_trial.h" @@ -26,8 +27,10 @@ NSString *const RTC_CONSTANT_TYPE(RTCFieldTrialEnabledValue) = @"Enabled"; // InitFieldTrialsFromString stores the char*, so the char array must outlive -// the application. +// the application. Keep all historical strings alive to avoid races where +// other threads read the previous pointer while we are updating it. static char *gFieldTrialInitString = nullptr; +static std::vector> gFieldTrialStorage; static os_unfair_lock fieldTrialLock = OS_UNFAIR_LOCK_INIT; void RTC_OBJC_TYPE(RTCInitFieldTrialDictionary)(NSDictionary *fieldTrials) { @@ -50,13 +53,8 @@ void RTC_OBJC_TYPE(RTCInitFieldTrialDictionary)(NSDictionary(len); + bool success = [fieldTrialInitString getCString:newString.get() maxLength:len encoding:NSUTF8StringEncoding]; if (!success) { @@ -65,6 +63,10 @@ void RTC_OBJC_TYPE(RTCInitFieldTrialDictionary)(NSDictionary