From 26e97c601793cc44d6db157c0a063de5fb3d17dc Mon Sep 17 00:00:00 2001
From: Dimitris Papastamos <s...@2f30.org>
Date: Wed, 22 Jun 2016 14:30:00 +0100
Subject: [PATCH] sndio: Fix segmentation fault when audio card is removed

This can happen if you remove an external audio card or if you stop
sndiod(8) while playing a song.

sio_write() will retry internally if it fails with errno == EINTR
so no need to handle that.
---
 src/output/plugins/SndioOutputPlugin.cxx | 11 +++++------
 1 file changed, 5 insertions(+), 6 deletions(-)

diff --git a/src/output/plugins/SndioOutputPlugin.cxx 
b/src/output/plugins/SndioOutputPlugin.cxx
index eac302a..e0897ca 100644
--- a/src/output/plugins/SndioOutputPlugin.cxx
+++ b/src/output/plugins/SndioOutputPlugin.cxx
@@ -17,7 +17,6 @@
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
-#include <errno.h>
 #include <sndio.h>
 #include <string.h>
 #include <unistd.h>
@@ -183,11 +182,11 @@ SndioOutput::Play(const void *chunk, size_t size, Error 
&error)
 
        while (1) {
                n = sio_write(sio_hdl, chunk, size);
-               if (n < 0) {
-                       if (errno == EINTR)
-                               continue;
-                       error.FormatErrno("Failed to write %zu bytes to sndio 
output", size);
-                       return 0;
+               if (n == 0) {
+                       if (sio_eof(sio_hdl)) {
+                               error.Set(sndio_output_domain, -1, "sndio write 
failed");
+                               return 0;
+                       }
                }
                return n;
        }
-- 
2.8.4


_______________________________________________
mpd-devel mailing list
mpd-devel@musicpd.org
http://mailman.blarg.de/listinfo/mpd-devel

Reply via email to