Davide Beatrici : winecoreaudio: Refactor get_device_name_from_guid() to allocate memory dynamically.
Module: wine Branch: master Commit: ec3929f93605b9194eef6d2b443bcb27e68a1d12 URL: https://gitlab.winehq.org/wine/wine/-/commit/ec3929f93605b9194eef6d2b443bcb2... Author: Davide Beatrici <git(a)davidebeatrici.dev> Date: Thu Jun 29 13:34:11 2023 +0200 winecoreaudio: Refactor get_device_name_from_guid() to allocate memory dynamically. --- dlls/winecoreaudio.drv/mmdevdrv.c | 29 ++++++++++++++++++++++------- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/dlls/winecoreaudio.drv/mmdevdrv.c b/dlls/winecoreaudio.drv/mmdevdrv.c index 9903640c66a..f8683fdf5fb 100644 --- a/dlls/winecoreaudio.drv/mmdevdrv.c +++ b/dlls/winecoreaudio.drv/mmdevdrv.c @@ -247,7 +247,7 @@ end: return params.result; } -static BOOL get_device_name_by_guid(const GUID *guid, char *name, const SIZE_T name_size, EDataFlow *flow) +static BOOL get_device_name_from_guid(const GUID *guid, char **name, EDataFlow *flow) { HKEY devices_key; UINT i = 0; @@ -292,7 +292,16 @@ static BOOL get_device_name_by_guid(const GUID *guid, char *name, const SIZE_T n return FALSE; } - WideCharToMultiByte(CP_UNIXCP, 0, key_name + 2, -1, name, name_size, NULL, NULL); + if(!(size = WideCharToMultiByte(CP_UNIXCP, 0, key_name + 2, -1, NULL, 0, NULL, NULL))) + return FALSE; + + if(!(*name = malloc(size))) + return FALSE; + + if(!WideCharToMultiByte(CP_UNIXCP, 0, key_name + 2, -1, *name, size, NULL, NULL)){ + free(*name); + return FALSE; + } return TRUE; } @@ -311,23 +320,30 @@ static BOOL get_device_name_by_guid(const GUID *guid, char *name, const SIZE_T n HRESULT WINAPI AUDDRV_GetAudioEndpoint(GUID *guid, IMMDevice *dev, IAudioClient **out) { ACImpl *This; - char name[256]; + char *name; SIZE_T name_len; EDataFlow dataflow; HRESULT hr; TRACE("%s %p %p\n", debugstr_guid(guid), dev, out); - if(!get_device_name_by_guid(guid, name, sizeof(name), &dataflow)) + if(!get_device_name_from_guid(guid, &name, &dataflow)) return AUDCLNT_E_DEVICE_INVALIDATED; - if(dataflow != eRender && dataflow != eCapture) + if(dataflow != eRender && dataflow != eCapture){ + free(name); return E_UNEXPECTED; + } name_len = strlen(name); This = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, offsetof(ACImpl, device_name[name_len + 1])); - if(!This) + if(!This){ + free(name); return E_OUTOFMEMORY; + } + + memcpy(This->device_name, name, name_len + 1); + free(name); This->IAudioClient3_iface.lpVtbl = &AudioClient3_Vtbl; This->IAudioRenderClient_iface.lpVtbl = &AudioRenderClient_Vtbl; @@ -337,7 +353,6 @@ HRESULT WINAPI AUDDRV_GetAudioEndpoint(GUID *guid, IMMDevice *dev, IAudioClient This->IAudioStreamVolume_iface.lpVtbl = &AudioStreamVolume_Vtbl; This->dataflow = dataflow; - memcpy(This->device_name, name, name_len + 1); hr = CoCreateFreeThreadedMarshaler((IUnknown *)&This->IAudioClient3_iface, &This->marshal); if (FAILED(hr)) {
participants (1)
-
Alexandre Julliard