Fixes #55362.
-- v2: winepulse: Fix crash when requesting exclusive mode with an unsupported format.
From: Davide Beatrici git@davidebeatrici.dev
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=55362 --- dlls/winepulse.drv/pulse.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-)
diff --git a/dlls/winepulse.drv/pulse.c b/dlls/winepulse.drv/pulse.c index 0e587033a6d..76693fa7408 100644 --- a/dlls/winepulse.drv/pulse.c +++ b/dlls/winepulse.drv/pulse.c @@ -2221,9 +2221,18 @@ static NTSTATUS pulse_is_format_supported(void *args) break; }
- /* This driver does not support exclusive mode. */ - if (exclusive && params->result == S_OK) - params->result = params->flow == eCapture ? AUDCLNT_E_UNSUPPORTED_FORMAT : AUDCLNT_E_EXCLUSIVE_MODE_NOT_ALLOWED; + if (exclusive) { + switch (params->result) { + case S_OK: + /* This driver does not support exclusive mode. */ + params->result = params->flow == eCapture ? + AUDCLNT_E_UNSUPPORTED_FORMAT : + AUDCLNT_E_EXCLUSIVE_MODE_NOT_ALLOWED; + break; + case S_FALSE: + params->result = AUDCLNT_E_UNSUPPORTED_FORMAT; + } + }
return STATUS_SUCCESS; }
Huw Davies (@huw) commented about dlls/winepulse.drv/pulse.c:
- /* This driver does not support exclusive mode. */
- if (exclusive && params->result == S_OK)
params->result = params->flow == eCapture ? AUDCLNT_E_UNSUPPORTED_FORMAT : AUDCLNT_E_EXCLUSIVE_MODE_NOT_ALLOWED;
- if (exclusive) {
switch (params->result) {
case S_OK:
/* This driver does not support exclusive mode. */
params->result = params->flow == eCapture ?
AUDCLNT_E_UNSUPPORTED_FORMAT :
AUDCLNT_E_EXCLUSIVE_MODE_NOT_ALLOWED;
break;
case S_FALSE:
params->result = AUDCLNT_E_UNSUPPORTED_FORMAT;
}
- }
Perhaps something like this is clearer:
```suggestion:-11+0 if (exclusive) { /* This driver does not support exclusive mode. */ if (params->result == S_OK) params->result = params->flow == eCapture ? AUDCLNT_E_UNSUPPORTED_FORMAT : AUDCLNT_E_EXCLUSIVE_MODE_NOT_ALLOWED; else if (params->result == S_FALSE) params->result = AUDCLNT_E_UNSUPPORTED_FORMAT; } ```
On Mon Aug 21 06:32:45 2023 +0000, Huw Davies wrote:
Perhaps something like this is clearer:
if (exclusive) { /* This driver does not support exclusive mode. */ if (params->result == S_OK) params->result = params->flow == eCapture ? AUDCLNT_E_UNSUPPORTED_FORMAT : AUDCLNT_E_EXCLUSIVE_MODE_NOT_ALLOWED; else if (params->result == S_FALSE) params->result = AUDCLNT_E_UNSUPPORTED_FORMAT; }
Yes, performance should be the same anyway.