From 7d396ff5b4c8d39f1c2c0dd18d7a90bf8496e360 Mon Sep 17 00:00:00 2001 From: Jonathan Kew Date: Wed, 1 Oct 2025 23:53:56 +0000 Subject: [PATCH] Bug 1988244 - Guard the space-features bit vectors with the feature-info mutex. a=RyanVM DONTBUILD Original Revision: https://phabricator.services.mozilla.com/D266136 Differential Revision: https://phabricator.services.mozilla.com/D267025 --- gfx/thebes/gfxFont.cpp | 10 ++++++++-- gfx/thebes/gfxFontEntry.h | 7 ++++--- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/gfx/thebes/gfxFont.cpp b/gfx/thebes/gfxFont.cpp index 5f738195c725..f9dccee78841 100644 --- a/gfx/thebes/gfxFont.cpp +++ b/gfx/thebes/gfxFont.cpp @@ -1427,6 +1427,7 @@ void gfxFont::CheckForFeaturesInvolvingSpace() const { flags = flags | gfxFontEntry::SpaceFeatures::HasFeatures; uint32_t index = static_cast(s) >> 5; uint32_t bit = static_cast(s) & 0x1f; + MutexAutoLock lock(mFontEntry->mFeatureInfoLock); if (isDefaultFeature) { mFontEntry->mDefaultSubSpaceFeatures[index] |= (1 << bit); } else { @@ -1440,8 +1441,11 @@ void gfxFont::CheckForFeaturesInvolvingSpace() const { // spaces in default features of default script? // ==> can't use word cache, skip GPOS analysis bool canUseWordCache = true; - if (HasSubstitution(mFontEntry->mDefaultSubSpaceFeatures, Script::COMMON)) { - canUseWordCache = false; + { + MutexAutoLock lock(mFontEntry->mFeatureInfoLock); + if (HasSubstitution(mFontEntry->mDefaultSubSpaceFeatures, Script::COMMON)) { + canUseWordCache = false; + } } // GPOS lookups - distinguish kerning from non-kerning features @@ -1460,6 +1464,7 @@ void gfxFont::CheckForFeaturesInvolvingSpace() const { } if (MOZ_UNLIKELY(log)) { + MutexAutoLock lock(mFontEntry->mFeatureInfoLock); TimeDuration elapsed = TimeStamp::Now() - start; LOG_FONTINIT(( "(fontinit-spacelookups) font: %s - " @@ -1494,6 +1499,7 @@ bool gfxFont::HasSubstitutionRulesWithSpaceLookups(Script aRunScript) const { } // default features have space lookups ==> true + MutexAutoLock lock(mFontEntry->mFeatureInfoLock); if (HasSubstitution(mFontEntry->mDefaultSubSpaceFeatures, Script::COMMON) || HasSubstitution(mFontEntry->mDefaultSubSpaceFeatures, aRunScript)) { return true; diff --git a/gfx/thebes/gfxFontEntry.h b/gfx/thebes/gfxFontEntry.h index f67f0c8c451e..b49a8cbce300 100644 --- a/gfx/thebes/gfxFontEntry.h +++ b/gfx/thebes/gfxFontEntry.h @@ -606,9 +606,10 @@ class gfxFontEntry { // bitvector of substitution space features per script, one each // for default and non-default features - uint32_t mDefaultSubSpaceFeatures[(int(Script::NUM_SCRIPT_CODES) + 31) / 32]; - uint32_t - mNonDefaultSubSpaceFeatures[(int(Script::NUM_SCRIPT_CODES) + 31) / 32]; + uint32_t mDefaultSubSpaceFeatures[(int(Script::NUM_SCRIPT_CODES) + 31) / + 32] MOZ_GUARDED_BY(mFeatureInfoLock); + uint32_t mNonDefaultSubSpaceFeatures[(int(Script::NUM_SCRIPT_CODES) + 31) / + 32] MOZ_GUARDED_BY(mFeatureInfoLock); mozilla::Atomic mUVSOffset;