qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH] hw/audio/c97: fix abort in audio_calloc()


From: Volker Rümelin
Subject: Re: [PATCH] hw/audio/c97: fix abort in audio_calloc()
Date: Mon, 26 Dec 2022 19:50:12 +0100
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.6.1

Am 25.12.22 um 13:13 schrieb Qiang Liu:

Hi Qiang,

I didn't receive your email probably because the reverse DNS entry of your mail server isn't setup correctly.
This is from the mail header of the qemu-devel mailing list server.
X-Host-Lookup-Failed: Reverse DNS lookup failed for 220.184.252.86 (failed)

Did you see my patches at https://lists.nongnu.org/archive/html/qemu-devel/2022-12/msg02895.html ? Patches 01/11 and 02/11 prevent the disturbing error message from audio_calloc and later patches remove the audio_calloc function.

I think the subject of your patch isn't correct. Your patch doesn't fix an abort in audio_calloc. In https://gitlab.com/qemu-project/qemu/-/issues/1393 you correctly notice this was already fixed.

Section 5.10.2 of the AC97 specification (https://hands.com/~lkcl/ac97_r23.pdf)
shows the feasibility to support for rates other than 48kHZ. Specifically,
AC97_PCM_Front_DAC_Rate (reg 2Ch) should be from 8kHZ to 48kHZ.

I think you misread section 5.10.2 of the AC97 Revision 2.3 specification. Section 5.10 is about S/PDIF concurrency. It doesn't say anything about the lowest sample rate limit without concurrent S/PDIF transmission. The emulated SigmaTel STAC9700 codec doesn't even have a S/PDIF output. But I have an example for sample rates lower than 8kHz. The Texas Instruments LM4546B is an AC97 codec which supports sample rates from 4kHz - 48kHz.

The STAC9700 is a 48kHz fixed rate codec. You won't find anything about the highest or lowest sample rate in its data sheet. Someone added the VRA and VRM modes in QEMU and the guest drivers don't seem to mind.

I would like to keep the ability to select a 1Hz sample rate, as there is no reason to artificially limit the lowest supported sample rate. See https://lists.nongnu.org/archive/html/qemu-devel/2022-10/msg03987.html

I would support a patch to limit the VRA and VRM modes to the highest supported rate of 48kHz. This is a technical limit for single data rate.

Before Volker Rümelin fixed it in 12f4abf6a245 and 0cbc8bd4694f, an adversary
could leverage this to crash QEMU.

Fixes: e5c9a13e2670 ("PCI AC97 emulation by malc.")
Reported-by: Volker Rümelin<vr_qemu@t-online.de>
Reported-by: Qiang Liu<cyruscyliu@gmail.com>
Resolves:https://gitlab.com/qemu-project/qemu/-/issues/1393
Signed-off-by: Qiang Liu<cyruscyliu@gmail.com>
---
  hw/audio/ac97.c | 11 ++++++++---
  1 file changed, 8 insertions(+), 3 deletions(-)

diff --git a/hw/audio/ac97.c b/hw/audio/ac97.c
index be2dd701a4..826411e462 100644
--- a/hw/audio/ac97.c
+++ b/hw/audio/ac97.c
@@ -625,9 +625,14 @@ static void nam_writew(void *opaque, uint32_t addr, 
uint32_t val)
          break;
      case AC97_PCM_Front_DAC_Rate:
          if (mixer_load(s, AC97_Extended_Audio_Ctrl_Stat) & EACS_VRA) {
-            mixer_store(s, addr, val);
-            dolog("Set front DAC rate to %d\n", val);
-            open_voice(s, PO_INDEX, val);
+            if (val >= 8000 && val <= 48000) {
+                mixer_store(s, addr, val);
+                dolog("Set front DAC rate to %d\n", val);
+                open_voice(s, PO_INDEX, val);
+            } else {
+                dolog("Attempt to set front DAC rate to %d, but valid is"
+                      "8-48kHZ\n", val);

This is not correct. If you limit the sample rate, you should echo back the closest supported sample rate. See AC'97 2.3 Section 5.8.3. It's not a guest error if the guest writes an unsupported sample rate to the Audio Sample Rate Control Registers, which means it's also not necessary to log this.

With best regards,
Volker

+            }
          } else {
              dolog("Attempt to set front DAC rate to %d, but VRA is not set\n",
                    val);




reply via email to

[Prev in Thread] Current Thread [Next in Thread]