diff --git a/dom/ipc/ContentParent.cpp b/dom/ipc/ContentParent.cpp index ade0ff2fe7f9..71d4e09fcdd5 100644 --- a/dom/ipc/ContentParent.cpp +++ b/dom/ipc/ContentParent.cpp @@ -2512,7 +2512,7 @@ bool ContentParent::BeginSubprocessLaunch(ProcessPriority aPriority) { // Instantiate the pref serializer. It will be cleaned up in // `LaunchSubprocessReject`/`LaunchSubprocessResolve`. mPrefSerializer = MakeUnique( - ShouldSyncPreference); + ShouldSanitizePreference); if (!mPrefSerializer->SerializeToSharedMemory()) { NS_WARNING("SharedPreferenceSerializer::SerializeToSharedMemory failed"); MarkAsDead(); @@ -3531,12 +3531,13 @@ ContentParent::Observe(nsISupports* aSubject, const char* aTopic, NS_LossyConvertUTF16toASCII strData(aData); // A pref changed. If it is useful to do so, inform child processes. - if (!ShouldSyncPreference(strData.Data())) { + if (ShouldSanitizePreference(strData.Data())) { return NS_OK; } Pref pref(strData, /* isLocked */ false, - !ShouldSyncPreference(strData.Data()), Nothing(), Nothing()); + ShouldSanitizePreference(strData.Data()), Nothing(), Nothing()); + Preferences::GetPreference(&pref); if (IsInitialized()) { MOZ_ASSERT(mQueuedPrefs.IsEmpty()); diff --git a/dom/media/ipc/RDDProcessHost.cpp b/dom/media/ipc/RDDProcessHost.cpp index 750e154b8d7d..c42bee622d61 100644 --- a/dom/media/ipc/RDDProcessHost.cpp +++ b/dom/media/ipc/RDDProcessHost.cpp @@ -47,7 +47,7 @@ bool RDDProcessHost::Launch(StringVector aExtraOpts) { MOZ_ASSERT(!mRDDChild); mPrefSerializer = - MakeUnique(ShouldSyncPreference); + MakeUnique(ShouldSanitizePreference); if (!mPrefSerializer->SerializeToSharedMemory()) { return false; } diff --git a/dom/media/ipc/RDDProcessManager.cpp b/dom/media/ipc/RDDProcessManager.cpp index cccee2fa1a89..b6dea16b14de 100644 --- a/dom/media/ipc/RDDProcessManager.cpp +++ b/dom/media/ipc/RDDProcessManager.cpp @@ -97,13 +97,12 @@ void RDDProcessManager::OnPreferenceChange(const char16_t* aData) { NS_LossyConvertUTF16toASCII strData(aData); // A pref changed. If it is useful to do so, inform child processes. - if (!ShouldSyncPreference(strData.Data(), false)) { + if (ShouldSanitizePreference(strData.Data(), false)) { return; } - mozilla::dom::Pref pref(strData, /* isLocked */ false, - !ShouldSyncPreference(strData.Data()), Nothing(), - Nothing()); + ShouldSanitizePreference(strData.Data(), false), + Nothing(), Nothing()); Preferences::GetPreference(&pref); if (!!mRDDChild) { diff --git a/gfx/ipc/GPUProcessHost.cpp b/gfx/ipc/GPUProcessHost.cpp index 92949b60d3b8..6770b594478c 100644 --- a/gfx/ipc/GPUProcessHost.cpp +++ b/gfx/ipc/GPUProcessHost.cpp @@ -43,7 +43,7 @@ bool GPUProcessHost::Launch(StringVector aExtraOpts) { MOZ_ASSERT(!gfxPlatform::IsHeadless()); mPrefSerializer = - MakeUnique(ShouldSyncPreference); + MakeUnique(ShouldSanitizePreference); if (!mPrefSerializer->SerializeToSharedMemory()) { return false; } diff --git a/gfx/ipc/GPUProcessManager.cpp b/gfx/ipc/GPUProcessManager.cpp index 6a5fc4620d57..0b5d3f47b111 100644 --- a/gfx/ipc/GPUProcessManager.cpp +++ b/gfx/ipc/GPUProcessManager.cpp @@ -162,13 +162,12 @@ void GPUProcessManager::OnPreferenceChange(const char16_t* aData) { NS_LossyConvertUTF16toASCII strData(aData); // A pref changed. If it is useful to do so, inform child processes. - if (!ShouldSyncPreference(strData.Data(), false)) { + if (ShouldSanitizePreference(strData.Data(), false)) { return; } - mozilla::dom::Pref pref(strData, /* isLocked */ false, - !ShouldSyncPreference(strData.Data()), Nothing(), - Nothing()); + ShouldSanitizePreference(strData.Data(), false), + Nothing(), Nothing()); Preferences::GetPreference(&pref); if (!!mGPUChild) { diff --git a/gfx/vr/ipc/VRProcessManager.cpp b/gfx/vr/ipc/VRProcessManager.cpp index 24045b919b7a..3e3f4417d2a7 100644 --- a/gfx/vr/ipc/VRProcessManager.cpp +++ b/gfx/vr/ipc/VRProcessManager.cpp @@ -217,13 +217,12 @@ void VRProcessManager::OnPreferenceChange(const char16_t* aData) { NS_LossyConvertUTF16toASCII strData(aData); // A pref changed. If it is useful to do so, inform child processes. - if (!ShouldSyncPreference(strData.Data(), false)) { + if (ShouldSanitizePreference(strData.Data(), false)) { return; } - mozilla::dom::Pref pref(strData, /* isLocked */ false, - !ShouldSyncPreference(strData.Data()), Nothing(), - Nothing()); + ShouldSanitizePreference(strData.Data(), false), + Nothing(), Nothing()); Preferences::GetPreference(&pref); if (!!mVRChild) { diff --git a/gfx/vr/ipc/VRProcessParent.cpp b/gfx/vr/ipc/VRProcessParent.cpp index 322b94d8ecc5..49a2c783934c 100644 --- a/gfx/vr/ipc/VRProcessParent.cpp +++ b/gfx/vr/ipc/VRProcessParent.cpp @@ -56,7 +56,7 @@ bool VRProcessParent::Launch() { ProcessChild::AddPlatformBuildID(extraArgs); mPrefSerializer = - MakeUnique(ShouldSyncPreference); + MakeUnique(ShouldSanitizePreference); if (!mPrefSerializer->SerializeToSharedMemory()) { return false; } diff --git a/ipc/glue/ProcessUtils.h b/ipc/glue/ProcessUtils.h index 3f28ffb89235..6851693d40b4 100644 --- a/ipc/glue/ProcessUtils.h +++ b/ipc/glue/ProcessUtils.h @@ -26,7 +26,7 @@ void SetThisProcessName(const char* aName); class SharedPreferenceSerializer final { public: explicit SharedPreferenceSerializer( - std::function&& aShouldSerializeFn); + std::function&& aShouldSanitizeFn); SharedPreferenceSerializer(SharedPreferenceSerializer&& aOther); ~SharedPreferenceSerializer(); @@ -48,7 +48,7 @@ class SharedPreferenceSerializer final { size_t mPrefsLength; UniqueFileHandle mPrefMapHandle; UniqueFileHandle mPrefsHandle; - std::function mShouldSerializeFn; + std::function mShouldSanitizeFn; }; class SharedPreferenceDeserializer final { diff --git a/ipc/glue/ProcessUtils_common.cpp b/ipc/glue/ProcessUtils_common.cpp index fd3e066b6f7f..7d5e8cc23850 100644 --- a/ipc/glue/ProcessUtils_common.cpp +++ b/ipc/glue/ProcessUtils_common.cpp @@ -18,8 +18,8 @@ namespace mozilla { namespace ipc { SharedPreferenceSerializer::SharedPreferenceSerializer( - std::function&& aShouldSerializeFn) - : mPrefMapSize(0), mPrefsLength(0), mShouldSerializeFn(aShouldSerializeFn) { + std::function&& aShouldSanitizeFn) + : mPrefMapSize(0), mPrefsLength(0), mShouldSanitizeFn(aShouldSanitizeFn) { MOZ_COUNT_CTOR(SharedPreferenceSerializer); } @@ -42,7 +42,7 @@ bool SharedPreferenceSerializer::SerializeToSharedMemory() { // Serialize the early prefs. nsAutoCStringN<1024> prefs; - Preferences::SerializePreferences(prefs, mShouldSerializeFn); + Preferences::SerializePreferences(prefs, mShouldSanitizeFn); mPrefsLength = prefs.Length(); base::SharedMemory shm; diff --git a/ipc/glue/UtilityProcessHost.cpp b/ipc/glue/UtilityProcessHost.cpp index 7b55d5355146..0e0aad0a0fce 100644 --- a/ipc/glue/UtilityProcessHost.cpp +++ b/ipc/glue/UtilityProcessHost.cpp @@ -61,7 +61,7 @@ bool UtilityProcessHost::Launch(StringVector aExtraOpts) { MOZ_ASSERT(!mUtilityProcessParent); mPrefSerializer = - MakeUnique(ShouldSyncPreference); + MakeUnique(ShouldSanitizePreference); if (!mPrefSerializer->SerializeToSharedMemory()) { return false; } diff --git a/ipc/glue/UtilityProcessManager.cpp b/ipc/glue/UtilityProcessManager.cpp index e49eb0b044ee..f827a9846022 100644 --- a/ipc/glue/UtilityProcessManager.cpp +++ b/ipc/glue/UtilityProcessManager.cpp @@ -94,13 +94,12 @@ void UtilityProcessManager::OnPreferenceChange(const char16_t* aData) { NS_LossyConvertUTF16toASCII strData(aData); // A pref changed. If it is useful to do so, inform child processes. - if (!ShouldSyncPreference(strData.Data(), false)) { + if (ShouldSanitizePreference(strData.Data(), false)) { return; } - mozilla::dom::Pref pref(strData, /* isLocked */ false, - !ShouldSyncPreference(strData.Data()), Nothing(), - Nothing()); + ShouldSanitizePreference(strData.Data(), false), + Nothing(), Nothing()); Preferences::GetPreference(&pref); if (bool(mProcessParent)) { diff --git a/modules/libpref/Preferences.cpp b/modules/libpref/Preferences.cpp index 91857eaf146b..3e311f5ad710 100644 --- a/modules/libpref/Preferences.cpp +++ b/modules/libpref/Preferences.cpp @@ -3579,7 +3579,7 @@ NS_IMPL_ISUPPORTS(Preferences, nsIPrefService, nsIObserver, nsIPrefBranch, /* static */ void Preferences::SerializePreferences( nsCString& aStr, - const std::function& aShouldSerializeFn) { + const std::function& aShouldSanitizeFn) { MOZ_RELEASE_ASSERT(InitStaticMembers()); aStr.Truncate(); @@ -3588,7 +3588,7 @@ void Preferences::SerializePreferences( Pref* pref = iter.get().get(); if (!pref->IsTypeNone() && pref->HasAdvisablySizedValues()) { pref->SerializeAndAppend( - aStr, !aShouldSerializeFn(pref->Name(), XRE_IsContentProcess())); + aStr, aShouldSanitizeFn(pref->Name(), XRE_IsContentProcess())); } } @@ -5671,8 +5671,8 @@ namespace mozilla { void UnloadPrefsModule() { Preferences::Shutdown(); } -bool ShouldSyncPreference(const char* aPref, - bool aIsContentProcess /* = true */) { +bool ShouldSanitizePreference(const char* aPref, + bool aIsContentProcess /* = true */) { #define PREF_LIST_ENTRY(s) \ { s, (sizeof(s) / sizeof(char)) - 1 } struct PrefListEntry { @@ -5697,11 +5697,11 @@ bool ShouldSyncPreference(const char* aPref, for (const auto& entry : sParentOnlyPrefBranchList) { if (strncmp(entry.mPrefBranch, aPref, entry.mLen) == 0) { - return false; + return true; } } - return true; + return false; } } // namespace mozilla diff --git a/modules/libpref/Preferences.h b/modules/libpref/Preferences.h index 29d15cddbce5..0282647d956d 100644 --- a/modules/libpref/Preferences.h +++ b/modules/libpref/Preferences.h @@ -532,7 +532,7 @@ class Preferences final : public nsIPrefService, static bool InitStaticMembers(); }; -bool ShouldSyncPreference(const char* aPref, bool aIsContentProcess = true); +bool ShouldSanitizePreference(const char* aPref, bool aIsContentProcess = true); } // namespace mozilla diff --git a/modules/libpref/test/gtest/Basics.cpp b/modules/libpref/test/gtest/Basics.cpp index 4f0ee3a17d7b..cfb991b166b0 100644 --- a/modules/libpref/test/gtest/Basics.cpp +++ b/modules/libpref/test/gtest/Basics.cpp @@ -44,11 +44,13 @@ TEST(PrefsBasics, Serialize) nsCString str; Preferences::SerializePreferences( - str, [](const char* aPref, bool) -> bool { return false; }); - ASSERT_STREQ(str.Data(), ""); + str, [](const char* aPref, bool) -> bool { return true; }); + // Assert everything was marked sanitized + ASSERT_EQ(nullptr, strstr(str.Data(), "--:")); Preferences::SerializePreferences(str, [](const char* aPref, bool) -> bool { return strncmp(aPref, "foo.bool", 8) == 0; }); - ASSERT_STREQ(str.Data(), "B-:8/foo.bool:T:F\n"); + // Assert the sanitized serializtion was found + ASSERT_NE(nullptr, strstr(str.Data(), "B-S:8/foo.bool:T:\n")); } diff --git a/netwerk/base/nsIOService.cpp b/netwerk/base/nsIOService.cpp index 7188399cb0ff..bde247d8e632 100644 --- a/netwerk/base/nsIOService.cpp +++ b/netwerk/base/nsIOService.cpp @@ -644,7 +644,7 @@ void nsIOService::NotifySocketProcessPrefsChanged(const char* aName) { } dom::Pref pref(nsCString(aName), /* isLocked */ false, - !ShouldSyncPreference(aName), Nothing(), Nothing()); + ShouldSanitizePreference(aName, false), Nothing(), Nothing()); Preferences::GetPreference(&pref); auto sendPrefUpdate = [pref]() { diff --git a/netwerk/ipc/SocketProcessHost.cpp b/netwerk/ipc/SocketProcessHost.cpp index 299c33cde0a8..8fe6dca4b51e 100644 --- a/netwerk/ipc/SocketProcessHost.cpp +++ b/netwerk/ipc/SocketProcessHost.cpp @@ -64,7 +64,7 @@ bool SocketProcessHost::Launch() { std::vector extraArgs; ProcessChild::AddPlatformBuildID(extraArgs); - SharedPreferenceSerializer prefSerializer(ShouldSyncPreference); + SharedPreferenceSerializer prefSerializer(ShouldSanitizePreference); if (!prefSerializer.SerializeToSharedMemory()) { return false; }