]> git.proxmox.com Git - qemu.git/commitdiff
oss/alsa: Do not invoke UB described in 7.15.1.1
authormalc <av1474@comtv.ru>
Thu, 1 Oct 2009 22:37:40 +0000 (02:37 +0400)
committermalc <av1474@comtv.ru>
Thu, 1 Oct 2009 22:37:40 +0000 (02:37 +0400)
Additional argument (whether to try poll mode) is only passed with
VOICE_ENABLE command.

Thanks to Markus Armbruster for noticing the potential breakage.

audio/alsaaudio.c
audio/ossaudio.c

index a4baebcb4023e23a6ecf5164f284533666a01480..b8de3a708dabf0f8bb3f3b956005da9ad225e571 100644 (file)
@@ -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");
index 946a9dc98fa8a8ae4996f8fb929f29a9adf29560..dae25e93ab2239d7398cbd0f1e4dd170c39b65eb 100644 (file)
@@ -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;