From 643f3c423aa939f7463b2aa858e796946bb52509 Mon Sep 17 00:00:00 2001 From: Jeremy Koritzinsky Date: Thu, 15 Sep 2022 09:52:54 -0700 Subject: [PATCH 1/5] Handle a null szPname field --- .../Interop/Windows/WinMm/Interop.waveOutGetDevCaps.cs | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/libraries/Common/src/Interop/Windows/WinMm/Interop.waveOutGetDevCaps.cs b/src/libraries/Common/src/Interop/Windows/WinMm/Interop.waveOutGetDevCaps.cs index 3c3e831fac98d4..9f9dca6fbf1678 100644 --- a/src/libraries/Common/src/Interop/Windows/WinMm/Interop.waveOutGetDevCaps.cs +++ b/src/libraries/Common/src/Interop/Windows/WinMm/Interop.waveOutGetDevCaps.cs @@ -50,7 +50,15 @@ public Native(WAVEOUTCAPS managed) wMid = managed.wMid; wPid = managed.wPid; vDriverVersion = managed.vDriverVersion; - managed.szPname.CopyTo(MemoryMarshal.CreateSpan(ref szPname[0], szPnameLength)); + Span szPnameSpan = MemoryMarshal.CreateSpan(ref szPname[0], szPnameLength); + if (managed.szPname is null) + { + szPnameSpan.Clear(); + } + else + { + managed.szPname.CopyTo(szPnameSpan); + } dwFormats = managed.dwFormats; wChannels = managed.wChannels; wReserved1 = managed.wReserved1; From a8072ded76aff5de0ada23a529f98d1825a378fc Mon Sep 17 00:00:00 2001 From: Jeremy Koritzinsky Date: Thu, 15 Sep 2022 10:01:02 -0700 Subject: [PATCH 2/5] Always clear the span to ensure we have a null terminator in case the string is short --- .../src/Interop/Windows/WinMm/Interop.waveOutGetDevCaps.cs | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/libraries/Common/src/Interop/Windows/WinMm/Interop.waveOutGetDevCaps.cs b/src/libraries/Common/src/Interop/Windows/WinMm/Interop.waveOutGetDevCaps.cs index 9f9dca6fbf1678..92719026fcb6f3 100644 --- a/src/libraries/Common/src/Interop/Windows/WinMm/Interop.waveOutGetDevCaps.cs +++ b/src/libraries/Common/src/Interop/Windows/WinMm/Interop.waveOutGetDevCaps.cs @@ -51,11 +51,8 @@ public Native(WAVEOUTCAPS managed) wPid = managed.wPid; vDriverVersion = managed.vDriverVersion; Span szPnameSpan = MemoryMarshal.CreateSpan(ref szPname[0], szPnameLength); - if (managed.szPname is null) - { - szPnameSpan.Clear(); - } - else + szPnameSpan.Clear(); + if (managed.szPname is not null) { managed.szPname.CopyTo(szPnameSpan); } From 26edf0e5e06a3fec9946176ce81770827511e44f Mon Sep 17 00:00:00 2001 From: Jeremy Koritzinsky Date: Thu, 15 Sep 2022 10:01:26 -0700 Subject: [PATCH 3/5] Use null conditional access --- .../src/Interop/Windows/WinMm/Interop.waveOutGetDevCaps.cs | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/libraries/Common/src/Interop/Windows/WinMm/Interop.waveOutGetDevCaps.cs b/src/libraries/Common/src/Interop/Windows/WinMm/Interop.waveOutGetDevCaps.cs index 92719026fcb6f3..a9ebcba2950c55 100644 --- a/src/libraries/Common/src/Interop/Windows/WinMm/Interop.waveOutGetDevCaps.cs +++ b/src/libraries/Common/src/Interop/Windows/WinMm/Interop.waveOutGetDevCaps.cs @@ -52,10 +52,7 @@ public Native(WAVEOUTCAPS managed) vDriverVersion = managed.vDriverVersion; Span szPnameSpan = MemoryMarshal.CreateSpan(ref szPname[0], szPnameLength); szPnameSpan.Clear(); - if (managed.szPname is not null) - { - managed.szPname.CopyTo(szPnameSpan); - } + managed.szPname?.CopyTo(szPnameSpan); dwFormats = managed.dwFormats; wChannels = managed.wChannels; wReserved1 = managed.wReserved1; From 12c56e33d6f519488ae2bb199f3d11f09ea42b59 Mon Sep 17 00:00:00 2001 From: Jeremy Koritzinsky Date: Thu, 15 Sep 2022 10:45:04 -0700 Subject: [PATCH 4/5] Add call to test to test scenario --- src/libraries/System.Speech/tests/SynthesizeRecognizeTests.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/libraries/System.Speech/tests/SynthesizeRecognizeTests.cs b/src/libraries/System.Speech/tests/SynthesizeRecognizeTests.cs index 3ae7d5697efe66..1bcdaaa8417d3d 100644 --- a/src/libraries/System.Speech/tests/SynthesizeRecognizeTests.cs +++ b/src/libraries/System.Speech/tests/SynthesizeRecognizeTests.cs @@ -38,6 +38,7 @@ public void SpeechSynthesizerToSpeechRecognitionEngine() { synth.SetOutputToWaveStream(ms); var prompt = new Prompt("synthesizer"); + synth.SetOutputToDefaultAudioDevice(); synth.Speak(prompt); } From deb3ffb3d99df44439131c852394e6101f47f007 Mon Sep 17 00:00:00 2001 From: Jeremy Koritzinsky Date: Thu, 15 Sep 2022 17:08:52 -0700 Subject: [PATCH 5/5] Update src/libraries/System.Speech/tests/SynthesizeRecognizeTests.cs --- src/libraries/System.Speech/tests/SynthesizeRecognizeTests.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/libraries/System.Speech/tests/SynthesizeRecognizeTests.cs b/src/libraries/System.Speech/tests/SynthesizeRecognizeTests.cs index 1bcdaaa8417d3d..3ae7d5697efe66 100644 --- a/src/libraries/System.Speech/tests/SynthesizeRecognizeTests.cs +++ b/src/libraries/System.Speech/tests/SynthesizeRecognizeTests.cs @@ -38,7 +38,6 @@ public void SpeechSynthesizerToSpeechRecognitionEngine() { synth.SetOutputToWaveStream(ms); var prompt = new Prompt("synthesizer"); - synth.SetOutputToDefaultAudioDevice(); synth.Speak(prompt); }