Skip to content
Snippets Groups Projects
Commit 06f40d59 authored by Jonathan Kew's avatar Jonathan Kew
Browse files

Bug 1879825 - Make Family::FindIndex fallible and safely handle failures....

Bug 1879825 - Make Family::FindIndex fallible and safely handle failures. r=gfx-reviewers,lsalzman, a=dsmith

Differential Revision: https://phabricator.services.mozilla.com/D201819
parent 2541acb6
No related merge requests found
......@@ -168,7 +168,11 @@ class SetCharMapRunnable : public mozilla::Runnable {
void Face::SetCharacterMap(FontList* aList, gfxCharacterMap* aCharMap,
const Family* aFamily) {
if (!XRE_IsParentProcess()) {
std::pair<uint32_t, bool> familyIndex = aFamily->FindIndex(aList);
Maybe<std::pair<uint32_t, bool>> familyIndex = aFamily->FindIndex(aList);
if (!familyIndex) {
NS_WARNING("Family index not found! Ignoring SetCharacterMap");
return;
}
const auto* faces = aFamily->Faces(aList);
uint32_t faceIndex = 0;
while (faceIndex < aFamily->NumFaces()) {
......@@ -177,14 +181,17 @@ void Face::SetCharacterMap(FontList* aList, gfxCharacterMap* aCharMap,
}
++faceIndex;
}
MOZ_RELEASE_ASSERT(faceIndex < aFamily->NumFaces(), "Face ptr not found!");
if (faceIndex >= aFamily->NumFaces()) {
NS_WARNING("Face not found in family! Ignoring SetCharacterMap");
return;
}
if (NS_IsMainThread()) {
dom::ContentChild::GetSingleton()->SendSetCharacterMap(
aList->GetGeneration(), familyIndex.first, familyIndex.second,
aList->GetGeneration(), familyIndex->first, familyIndex->second,
faceIndex, *aCharMap);
} else {
NS_DispatchToMainThread(new SetCharMapRunnable(
aList->GetGeneration(), familyIndex, faceIndex, aCharMap));
aList->GetGeneration(), familyIndex.value(), faceIndex, aCharMap));
}
return;
}
......@@ -629,16 +636,20 @@ void Family::SetupFamilyCharMap(FontList* aList) {
if (!XRE_IsParentProcess()) {
// |this| could be a Family record in either the Families() or Aliases()
// arrays; FindIndex will map it back to its index and which array.
std::pair<uint32_t, bool> index = FindIndex(aList);
Maybe<std::pair<uint32_t, bool>> index = FindIndex(aList);
if (!index) {
NS_WARNING("Family index not found! Ignoring SetupFamilyCharMap");
return;
}
if (NS_IsMainThread()) {
dom::ContentChild::GetSingleton()->SendSetupFamilyCharMap(
aList->GetGeneration(), index.first, index.second);
aList->GetGeneration(), index->first, index->second);
return;
}
NS_DispatchToMainThread(NS_NewRunnableFunction(
"SetupFamilyCharMap callback",
[gen = aList->GetGeneration(), idx = index.first,
alias = index.second] {
[gen = aList->GetGeneration(), idx = index->first,
alias = index->second] {
dom::ContentChild::GetSingleton()->SendSetupFamilyCharMap(gen, idx,
alias);
}));
......@@ -685,13 +696,13 @@ void Family::SetupFamilyCharMap(FontList* aList) {
}
}
std::pair<uint32_t, bool> Family::FindIndex(FontList* aList) const {
Maybe<std::pair<uint32_t, bool>> Family::FindIndex(FontList* aList) const {
const auto* start = aList->Families();
const auto* end = start + aList->NumFamilies();
if (this >= start && this < end) {
uint32_t index = this - start;
MOZ_RELEASE_ASSERT(start + index == this, "misaligned Family ptr!");
return std::pair(index, false);
return Some(std::pair(index, false));
}
start = aList->AliasFamilies();
......@@ -699,10 +710,10 @@ std::pair<uint32_t, bool> Family::FindIndex(FontList* aList) const {
if (this >= start && this < end) {
uint32_t index = this - start;
MOZ_RELEASE_ASSERT(start + index == this, "misaligned AliasFamily ptr!");
return std::pair(index, true);
return Some(std::pair(index, true));
}
MOZ_CRASH("invalid font-list Family ptr!");
return Nothing();
}
FontList::FontList(uint32_t aGeneration) {
......
......@@ -333,7 +333,8 @@ struct Family {
// Return the index of this family in the font-list's Families() or
// AliasFamilies() list, and which of those it belongs to.
std::pair<uint32_t, bool> FindIndex(FontList* aList) const;
// Returns Nothing if the family cannot be found.
mozilla::Maybe<std::pair<uint32_t, bool>> FindIndex(FontList* aList) const;
private:
// Returns true if there are specifically-sized bitmap faces in the list,
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment