qemu-commits
[Top][All Lists]
Advanced

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

[Qemu-commits] [COMMIT 301901b] oss/alsa: Do not invoke UB described in


From: Anthony Liguori
Subject: [Qemu-commits] [COMMIT 301901b] oss/alsa: Do not invoke UB described in 7.15.1.1
Date: Thu, 01 Oct 2009 22:39:04 -0000

From: malc <address@hidden>

Additional argument (whether to try poll mode) is only passed with
VOICE_ENABLE command.

Thanks to Markus Armbruster for noticing the potential breakage.

diff --git a/audio/alsaaudio.c b/audio/alsaaudio.c
index a4baebc..b8de3a7 100644
--- a/audio/alsaaudio.c
+++ b/audio/alsaaudio.c
@@ -861,22 +861,25 @@ static int alsa_voice_ctl (snd_pcm_t *handle, const char 
*typ, int pause)
 
 static int alsa_ctl_out (HWVoiceOut *hw, int cmd, ...)
 {
-    va_list ap;
-    int poll_mode;
     ALSAVoiceOut *alsa = (ALSAVoiceOut *) hw;
 
-    va_start (ap, cmd);
-    poll_mode = va_arg (ap, int);
-    va_end (ap);
-
     switch (cmd) {
     case VOICE_ENABLE:
-        ldebug ("enabling voice\n");
-        if (poll_mode && alsa_poll_out (hw)) {
-            poll_mode = 0;
+        {
+            va_list ap;
+            int poll_mode;
+
+            va_start (ap, cmd);
+            poll_mode = va_arg (ap, int);
+            va_end (ap);
+
+            ldebug ("enabling voice\n");
+            if (poll_mode && alsa_poll_out (hw)) {
+                poll_mode = 0;
+            }
+            hw->poll_mode = poll_mode;
+            return alsa_voice_ctl (alsa->handle, "playback", 0);
         }
-        hw->poll_mode = poll_mode;
-        return alsa_voice_ctl (alsa->handle, "playback", 0);
 
     case VOICE_DISABLE:
         ldebug ("disabling voice\n");
diff --git a/audio/ossaudio.c b/audio/ossaudio.c
index 946a9dc..dae25e9 100644
--- a/audio/ossaudio.c
+++ b/audio/ossaudio.c
@@ -583,34 +583,37 @@ static int oss_init_out (HWVoiceOut *hw, struct 
audsettings *as)
 static int oss_ctl_out (HWVoiceOut *hw, int cmd, ...)
 {
     int trig;
-    va_list ap;
-    int poll_mode;
     OSSVoiceOut *oss = (OSSVoiceOut *) hw;
 
-    va_start (ap, cmd);
-    poll_mode = va_arg (ap, int);
-    va_end (ap);
-
     switch (cmd) {
     case VOICE_ENABLE:
-        ldebug ("enabling voice\n");
-        if (poll_mode && oss_poll_out (hw)) {
-            poll_mode = 0;
-        }
-        hw->poll_mode = poll_mode;
+        {
+            va_list ap;
+            int poll_mode;
 
-        if (!oss->mmapped) {
-            return 0;
-        }
+            va_start (ap, cmd);
+            poll_mode = va_arg (ap, int);
+            va_end (ap);
 
-        audio_pcm_info_clear_buf (&hw->info, oss->pcm_buf, hw->samples);
-        trig = PCM_ENABLE_OUTPUT;
-        if (ioctl (oss->fd, SNDCTL_DSP_SETTRIGGER, &trig) < 0) {
-            oss_logerr (
-                errno,
-                "SNDCTL_DSP_SETTRIGGER PCM_ENABLE_OUTPUT failed\n"
-                );
-            return -1;
+            ldebug ("enabling voice\n");
+            if (poll_mode && oss_poll_out (hw)) {
+                poll_mode = 0;
+            }
+            hw->poll_mode = poll_mode;
+
+            if (!oss->mmapped) {
+                return 0;
+            }
+
+            audio_pcm_info_clear_buf (&hw->info, oss->pcm_buf, hw->samples);
+            trig = PCM_ENABLE_OUTPUT;
+            if (ioctl (oss->fd, SNDCTL_DSP_SETTRIGGER, &trig) < 0) {
+                oss_logerr (
+                    errno,
+                    "SNDCTL_DSP_SETTRIGGER PCM_ENABLE_OUTPUT failed\n"
+                    );
+                return -1;
+            }
         }
         break;
 




reply via email to

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