From cf503f956071895b6e1d467afdc1e10382d60c87 Mon Sep 17 00:00:00 2001 From: Arun Raghavan Date: Mon, 4 Jan 2016 12:16:01 +0530 Subject: [PATCH] coreaudio: Dynamically allocate C string when converting from CFString --- src/modules/macosx/module-coreaudio-device.c | 58 +++++++++++++++------------- 1 file changed, 31 insertions(+), 27 deletions(-) diff --git a/src/modules/macosx/module-coreaudio-device.c b/src/modules/macosx/module-coreaudio-device.c index 0c92d42..aa299a0 100644 --- a/src/modules/macosx/module-coreaudio-device.c +++ b/src/modules/macosx/module-coreaudio-device.c @@ -376,23 +376,25 @@ static int ca_sink_set_state(pa_sink *s, pa_sink_state_t state) { } /* Caveat: The caller is responsible to get rid of the CFString(Ref). */ -static bool CFString_to_cstr_n(CFStringRef cfstr, char *buf, long n) { - bool ret; - - pa_assert (buf); +static char * CFString_to_cstr(CFStringRef cfstr) { + char *ret = NULL; ret = false; if (cfstr != NULL) { const char *tmp = CFStringGetCStringPtr(cfstr, kCFStringEncodingUTF8); + CFIndex n = CFStringGetLength(cfstr) + 1 /* for the terminating NULL */; + + ret = pa_xmalloc(n); if (tmp == NULL) { - if (CFStringGetCString(cfstr, buf, n, kCFStringEncodingUTF8)) - ret = true; + if (!CFStringGetCString(cfstr, ret, n, kCFStringEncodingUTF8)) { + pa_xfree(ret); + ret = NULL; + } } else { - strncpy(buf, tmp, n); - buf[n - 1] = 0; - ret = true; + strncpy(ret, tmp, n - 1); + ret[n - 1] = '\0'; } } @@ -408,7 +410,7 @@ static int ca_device_create_sink(pa_module *m, AudioBuffer *buf, int channel_idx coreaudio_sink *ca_sink; pa_sink *sink; unsigned int i; - char tmp[255]; + char *tmp; pa_strbuf *strbuf; AudioObjectPropertyAddress property_address; CFStringRef tmp_cfstr = NULL; @@ -425,23 +427,24 @@ static int ca_device_create_sink(pa_module *m, AudioBuffer *buf, int channel_idx property_address.mSelector = kAudioObjectPropertyElementName; property_address.mScope = kAudioDevicePropertyScopeOutput; property_address.mElement = channel_idx + i + 1; - size = sizeof(tmp); + size = sizeof(tmp_cfstr); err = AudioObjectGetPropertyData(u->object_id, &property_address, 0, NULL, &size, &tmp_cfstr); if (err == 0) { - err = !(CFString_to_cstr_n(tmp_cfstr, tmp, sizeof(tmp))); + tmp = CFString_to_cstr(tmp_cfstr); - if (tmp_cfstr) { + if (tmp_cfstr) CFRelease(tmp_cfstr); - } } - if (err || !strlen(tmp)) - snprintf(tmp, sizeof(tmp), "Channel %d", (int) property_address.mElement); - if (i > 0) pa_strbuf_puts(strbuf, ", "); - pa_strbuf_puts(strbuf, tmp); + if (err || !tmp || !strlen(tmp)) + pa_strbuf_printf(strbuf, "Channel %d", (int) property_address.mElement); + else + pa_strbuf_puts(strbuf, tmp); + + pa_xfree(tmp); } ca_sink->name = pa_strbuf_to_string_free(strbuf); @@ -535,7 +538,7 @@ static int ca_device_create_source(pa_module *m, AudioBuffer *buf, int channel_i coreaudio_source *ca_source; pa_source *source; unsigned int i; - char tmp[255]; + char *tmp; pa_strbuf *strbuf; AudioObjectPropertyAddress property_address; CFStringRef tmp_cfstr = NULL; @@ -552,23 +555,24 @@ static int ca_device_create_source(pa_module *m, AudioBuffer *buf, int channel_i property_address.mSelector = kAudioObjectPropertyElementName; property_address.mScope = kAudioDevicePropertyScopeInput; property_address.mElement = channel_idx + i + 1; - size = sizeof(tmp); + size = sizeof(tmp_cfstr); err = AudioObjectGetPropertyData(u->object_id, &property_address, 0, NULL, &size, &tmp_cfstr); if (err == 0) { - err = !(CFString_to_cstr_n(tmp_cfstr, tmp, sizeof(tmp))); + tmp = CFString_to_cstr(tmp_cfstr); - if (tmp_cfstr) { + if (tmp_cfstr) CFRelease(tmp_cfstr); - } } - if (err || !strlen(tmp)) - snprintf(tmp, sizeof(tmp), "Channel %d", (int) property_address.mElement); - if (i > 0) pa_strbuf_puts(strbuf, ", "); - pa_strbuf_puts(strbuf, tmp); + if (err || !tmp || !strlen(tmp)) + pa_strbuf_printf(strbuf, "Channel %d", (int) property_address.mElement); + else + pa_strbuf_puts(strbuf, tmp); + + pa_xfree(tmp); } ca_source->name = pa_strbuf_to_string_free(strbuf); -- 2.7.4