Don't crash on unexpected CTFontDescription content

Don't crash in wxNativeFontInfo::InitFromDescriptor() in wxOSX when the
provided descriptor doesn't contain kCTFontTraitsAttribute.

This can happen e.g. when the descriptor was deserialized from a plist
dictionary and the corresponding font is not present on the system.

Closes #26411.
This commit is contained in:
Václav Slavík
2026-04-30 19:10:50 +02:00
committed by Vadim Zeitlin
parent dbce2cf0d1
commit bbdbf45dce
+9 -2
View File
@@ -887,9 +887,10 @@ void wxNativeFontInfo::InitFromFontDescriptor(CTFontDescriptorRef desc)
// determine approximate family
CTFontSymbolicTraits symbolicTraits;
CTFontSymbolicTraits symbolicTraits = 0;
wxCFDictionaryRef traits((CFDictionaryRef)CTFontDescriptorCopyAttribute(desc, kCTFontTraitsAttribute));
traits.GetValue(kCTFontSymbolicTrait).GetValue((int32_t*)&symbolicTraits, 0);
if (traits)
traits.GetValue(kCTFontSymbolicTrait).GetValue((int32_t*)&symbolicTraits, 0);
if (symbolicTraits & kCTFontMonoSpaceTrait)
m_family = wxFONTFAMILY_TELETYPE;
@@ -1026,6 +1027,8 @@ CGFloat wxNativeFontInfo::GetCTWeight(CTFontDescriptorRef descr)
{
CGFloat weight;
CFTypeRef fonttraitstype = CTFontDescriptorCopyAttribute(descr, kCTFontTraitsAttribute);
if (!fonttraitstype)
return CGFloat(0.0);
wxCFDictionaryRef traits((CFDictionaryRef)fonttraitstype);
traits.GetValue(kCTFontWeightTrait).GetValue(&weight, CGFloat(0.0));
return weight;
@@ -1035,6 +1038,8 @@ CGFloat wxNativeFontInfo::GetCTwidth(CTFontDescriptorRef descr)
{
CGFloat weight;
CFTypeRef fonttraitstype = CTFontDescriptorCopyAttribute(descr, kCTFontTraitsAttribute);
if (!fonttraitstype)
return CGFloat(0.0);
wxCFDictionaryRef traits((CFDictionaryRef)fonttraitstype);
traits.GetValue(kCTFontWidthTrait).GetValue(&weight, CGFloat(0.0));
return weight;
@@ -1044,6 +1049,8 @@ CGFloat wxNativeFontInfo::GetCTSlant(CTFontDescriptorRef descr)
{
CGFloat slant;
CFTypeRef fonttraitstype = CTFontDescriptorCopyAttribute(descr, kCTFontTraitsAttribute);
if (!fonttraitstype)
return CGFloat(0.0);
wxCFDictionaryRef traits((CFDictionaryRef)fonttraitstype);
traits.GetValue(kCTFontSlantTrait).GetValue(&slant, CGFloat(0.0));
return slant;