From 13c6d9fedfec139ffafb593425e2ee0fbc17c00d Mon Sep 17 00:00:00 2001 From: Philip Withnall Date: Sat, 14 Oct 2017 09:04:43 +0100 Subject: [PATCH] Revert "[MacOS] Fallback to CFStringGetCSTring if CFStringGetCStringPtr fails." MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit c60226e0a1cae40a96ed0bf95ca7d5a508548f58. Pushed without review. This should be reviewed on bug #788936 first. Several issues with the patch: • Takes the string length unnecessarily early. • Calls CFRelease(str) before g_strdup(cstr) which could lead to use-after-free. • Code style issues. • Don’t want to encourage pushing patches without review. --- gio/gosxappinfo.c | 34 ++-------------------------------- gio/gosxcontenttype.c | 34 ++-------------------------------- 2 files changed, 4 insertions(+), 64 deletions(-) diff --git a/gio/gosxappinfo.c b/gio/gosxappinfo.c index 7c2b402ae..b24b6fffa 100644 --- a/gio/gosxappinfo.c +++ b/gio/gosxappinfo.c @@ -175,44 +175,14 @@ static gchar * create_cstr_from_cfstring (CFStringRef str) { const gchar *cstr; - CFIndex length = CFStringGetLength (str); - char *buffer = NULL; if (str == NULL) return NULL; cstr = CFStringGetCStringPtr (str, kCFStringEncodingUTF8); - /* CFStringGetCStringPtr returns "NULL if the internal storage of - * theString does not allow [a pointer] to be returned efficiently". - * (Apple's docs don't say what that means). In that case we must - * use CFStringGetCString as a fallback. - */ - if (cstr != NULL) - { - CFRelease (str); - return g_strdup (cstr); - } - - buffer = g_malloc0 (length + 1); - /* Start off with a buffer size sufficient for the most likely case - * that the CFString is ASCII so the UTF8 representation will be 1 - * byte per code point. Keep trying up to 4 bytes per code point, - * the max allowed by RFC3629. - */ - for (int i = 1; i <= 4; ++i) - { - if (CFStringGetCString (str, buffer, length, kCFStringEncodingUTF8)) - { - CFRelease (str); - return buffer; - } - length += length; - buffer = g_realloc (buffer, length + 1); - } - - g_free (buffer); CFRelease (str); - return NULL; + + return g_strdup (cstr); } static char * diff --git a/gio/gosxcontenttype.c b/gio/gosxcontenttype.c index c046d9e14..485f5bfb6 100644 --- a/gio/gosxcontenttype.c +++ b/gio/gosxcontenttype.c @@ -53,44 +53,14 @@ static gchar * create_cstr_from_cfstring (CFStringRef str) { const gchar *cstr; - CFIndex length = CFStringGetLength (str); - char *buffer = NULL; if (str == NULL) return NULL; cstr = CFStringGetCStringPtr (str, kCFStringEncodingUTF8); - /* CFStringGetCStringPtr returns "NULL if the internal storage of - * theString does not allow [a pointer] to be returned efficiently". - * (Apple's docs don't say what that means). In that case we must - * use CFStringGetCString as a fallback. - */ - if (cstr != NULL) - { - CFRelease (str); - return g_strdup (cstr); - } - - buffer = g_malloc0 (length + 1); - /* Start off with a buffer size sufficient for the most likely case - * that the CFString is ASCII so the UTF8 representation will be 1 - * byte per code point. Keep trying up to 4 bytes per code point, - * the max allowed by RFC3629. - */ - for (int i = 1; i <= 4; ++i) - { - if (CFStringGetCString (str, buffer, length, kCFStringEncodingUTF8)) - { - CFRelease (str); - return buffer; - } - length += length; - buffer = g_realloc (buffer, length + 1); - } - - g_free (buffer); CFRelease (str); - return NULL; + + return g_strdup (cstr); } /*< internal >