From a630b125ef4429c1c52c1272eba8b7939e7e6857 Mon Sep 17 00:00:00 2001 From: Brendan Shanks Date: Fri, 5 Apr 2024 22:05:52 -0700 Subject: [PATCH] winecoreaudio: Correctly handle devices whose UID contains non-ASCII characters. --- dlls/winecoreaudio.drv/coreaudio.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/dlls/winecoreaudio.drv/coreaudio.c b/dlls/winecoreaudio.drv/coreaudio.c index d78744455a8..a79a0d16839 100644 --- a/dlls/winecoreaudio.drv/coreaudio.c +++ b/dlls/winecoreaudio.drv/coreaudio.c @@ -325,7 +325,12 @@ static NTSTATUS unix_get_endpoint_ids(void *args) for(i = 0; i < params->num; i++){ const SIZE_T name_len = CFStringGetLength(info[i].name) + 1; - const SIZE_T device_len = CFStringGetLength(info[i].uid) + 1; + CFIndex device_len; + + CFStringGetBytes(info[i].uid, CFRangeMake(0, CFStringGetLength(info[i].uid)), kCFStringEncodingUTF8, + 0, false, NULL, 0, &device_len); + device_len++; /* for null terminator */ + needed += name_len * sizeof(WCHAR) + ((device_len + 1) & ~1); if(needed <= params->size){ @@ -336,7 +341,8 @@ static NTSTATUS unix_get_endpoint_ids(void *args) offset += name_len * sizeof(WCHAR); endpoint->device = offset; - CFStringGetCString(info[i].uid, (char *)params->endpoints + offset, params->size - offset, kCFStringEncodingUTF8); + CFStringGetBytes(info[i].uid, CFRangeMake(0, CFStringGetLength(info[i].uid)), kCFStringEncodingUTF8, + 0, false, (UInt8 *)params->endpoints + offset, params->size - offset, NULL); ((char *)params->endpoints)[offset + device_len - 1] = '\0'; offset += (device_len + 1) & ~1;