freetype: Fix copying char buffer of CStringRef on darwin
authorMarvin Scholz <epirat07@gmail.com>
Sat, 17 Jun 2017 14:57:34 +0000 (16:57 +0200)
committerMarvin Scholz <epirat07@gmail.com>
Mon, 19 Jun 2017 12:32:37 +0000 (14:32 +0200)
To convert a CStringRef to a char buffer, CFStringGetCStringPtr was
used, but the documentation states this can fail in some
circumstances and it does fail on 10.7 for example.

This commit fixes this by adding a helper function, which falls back to
CFStringGetCString, as suggested in the CFStringGetCStringPtr docs.

modules/text_renderer/freetype/fonts/darwin.c

index 5225028..c23ac8a 100644 (file)
 char* getPathForFontDescription(CTFontDescriptorRef fontDescriptor);
 void addNewFontToFamily(filter_t *p_filter, CTFontDescriptorRef iter, char *path, vlc_family_t *family);
 
+static char* getCStringCopyForCFStringRef(CFStringRef cfstring, CFStringEncoding encoding)
+{
+    // Try to get pointer directly
+    const char *cptr = CFStringGetCStringPtr(cfstring, encoding);
+    if (cptr) {
+        return strdup(cptr);
+    }
+
+    // If it fails, use CFStringGetCString
+    CFIndex len = CFStringGetLength(cfstring);
+    CFIndex size = CFStringGetMaximumSizeForEncoding(len, encoding);
+    char *buffer = calloc(len + 1, sizeof(char));
+
+    if (CFStringGetCString(cfstring, buffer, size, encoding)) {
+        return buffer;
+    } else {
+        free(buffer);
+        return NULL;
+    }
+}
+
 char* getPathForFontDescription(CTFontDescriptorRef fontDescriptor)
 {
     CFURLRef url = CTFontDescriptorCopyAttribute(fontDescriptor, kCTFontURLAttribute);
     CFStringRef path = CFURLCopyFileSystemPath(url, kCFURLPOSIXPathStyle);
-    char *cpath = (char *)CFStringGetCStringPtr(path, kCFStringEncodingUTF8);
-    char *retPath = NULL;
-    if (cpath) {
-        retPath = strdup(cpath);
-    }
+    char *retPath = getCStringCopyForCFStringRef(path, kCFStringEncodingUTF8);
     CFRelease(path);
     CFRelease(url);
     return retPath;