From 9e09e5bdef0f00ac575d291c5510b8ba819f6bac Mon Sep 17 00:00:00 2001 From: Hiroshi Horie <548776+hiroshihorie@users.noreply.github.com> Date: Fri, 12 Dec 2025 02:27:47 +0900 Subject: [PATCH] patch1 --- sdk/objc/api/peerconnection/RTCFieldTrials.mm | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) 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