From efb3cf1db4ccc777773cc70440bf7418d66c4048 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pa=CC=84vels=20Nadtoc=CC=8Cajevs?= <7645683+bruvzg@users.noreply.github.com> Date: Sun, 9 Mar 2025 20:57:57 +0200 Subject: [PATCH] [macOS/iOS] Fix system font family descriptor leak. (cherry picked from commit c5dcecc6f742fbbafe4ce10baf476ce240ad0f88) --- platform/ios/os_ios.mm | 31 +++++++++++++++++-------------- platform/macos/os_macos.mm | 31 +++++++++++++++++-------------- 2 files changed, 34 insertions(+), 28 deletions(-) diff --git a/platform/ios/os_ios.mm b/platform/ios/os_ios.mm index e1489f02f13..1d4db2fced8 100644 --- a/platform/ios/os_ios.mm +++ b/platform/ios/os_ios.mm @@ -534,23 +534,26 @@ Vector OS_IOS::get_system_font_path_for_text(const String &p_font_name, CTFontDescriptorRef font = CTFontDescriptorCreateWithAttributes(attributes); if (font) { CTFontRef family = CTFontCreateWithFontDescriptor(font, 0, nullptr); - CFStringRef string = CFStringCreateWithCString(kCFAllocatorDefault, p_text.utf8().get_data(), kCFStringEncodingUTF8); - CFRange range = CFRangeMake(0, CFStringGetLength(string)); - CTFontRef fallback_family = CTFontCreateForString(family, string, range); - if (fallback_family) { - CTFontDescriptorRef fallback_font = CTFontCopyFontDescriptor(fallback_family); - if (fallback_font) { - CFURLRef url = (CFURLRef)CTFontDescriptorCopyAttribute(fallback_font, kCTFontURLAttribute); - if (url) { - NSString *font_path = [NSString stringWithString:[(__bridge NSURL *)url path]]; - ret.push_back(String::utf8([font_path UTF8String])); - CFRelease(url); + if (family) { + CFStringRef string = CFStringCreateWithCString(kCFAllocatorDefault, p_text.utf8().get_data(), kCFStringEncodingUTF8); + CFRange range = CFRangeMake(0, CFStringGetLength(string)); + CTFontRef fallback_family = CTFontCreateForString(family, string, range); + if (fallback_family) { + CTFontDescriptorRef fallback_font = CTFontCopyFontDescriptor(fallback_family); + if (fallback_font) { + CFURLRef url = (CFURLRef)CTFontDescriptorCopyAttribute(fallback_font, kCTFontURLAttribute); + if (url) { + NSString *font_path = [NSString stringWithString:[(__bridge NSURL *)url path]]; + ret.push_back(String::utf8([font_path UTF8String])); + CFRelease(url); + } + CFRelease(fallback_font); } - CFRelease(fallback_font); + CFRelease(fallback_family); } - CFRelease(fallback_family); + CFRelease(string); + CFRelease(family); } - CFRelease(string); CFRelease(font); } diff --git a/platform/macos/os_macos.mm b/platform/macos/os_macos.mm index fd8156b68fe..085a4d281be 100644 --- a/platform/macos/os_macos.mm +++ b/platform/macos/os_macos.mm @@ -544,23 +544,26 @@ Vector OS_MacOS::get_system_font_path_for_text(const String &p_font_name CTFontDescriptorRef font = CTFontDescriptorCreateWithAttributes(attributes); if (font) { CTFontRef family = CTFontCreateWithFontDescriptor(font, 0, nullptr); - CFStringRef string = CFStringCreateWithCString(kCFAllocatorDefault, p_text.utf8().get_data(), kCFStringEncodingUTF8); - CFRange range = CFRangeMake(0, CFStringGetLength(string)); - CTFontRef fallback_family = CTFontCreateForString(family, string, range); - if (fallback_family) { - CTFontDescriptorRef fallback_font = CTFontCopyFontDescriptor(fallback_family); - if (fallback_font) { - CFURLRef url = (CFURLRef)CTFontDescriptorCopyAttribute(fallback_font, kCTFontURLAttribute); - if (url) { - NSString *font_path = [NSString stringWithString:[(__bridge NSURL *)url path]]; - ret.push_back(String::utf8([font_path UTF8String])); - CFRelease(url); + if (family) { + CFStringRef string = CFStringCreateWithCString(kCFAllocatorDefault, p_text.utf8().get_data(), kCFStringEncodingUTF8); + CFRange range = CFRangeMake(0, CFStringGetLength(string)); + CTFontRef fallback_family = CTFontCreateForString(family, string, range); + if (fallback_family) { + CTFontDescriptorRef fallback_font = CTFontCopyFontDescriptor(fallback_family); + if (fallback_font) { + CFURLRef url = (CFURLRef)CTFontDescriptorCopyAttribute(fallback_font, kCTFontURLAttribute); + if (url) { + NSString *font_path = [NSString stringWithString:[(__bridge NSURL *)url path]]; + ret.push_back(String::utf8([font_path UTF8String])); + CFRelease(url); + } + CFRelease(fallback_font); } - CFRelease(fallback_font); + CFRelease(fallback_family); } - CFRelease(fallback_family); + CFRelease(string); + CFRelease(family); } - CFRelease(string); CFRelease(font); }