raop: Fix infinite loop in raop-sink with UDP mode
authorRODRIGUEZ Christophe <chrisrodri@free.fr>
Sat, 17 Aug 2019 10:43:20 +0000 (10:43 +0000)
committerArun Raghavan <arun@arunraghavan.net>
Sat, 17 Aug 2019 10:43:20 +0000 (10:43 +0000)
There are potentially unresolved issues around the EAGAIN logic, but
this should prevent an infinite loop and log flood in the mean time.

Fixes: https://gitlab.freedesktop.org/pulseaudio/pulseaudio/issues/695

src/modules/raop/raop-sink.c

index 02cf56a..d5ce6dc 100644 (file)
@@ -388,6 +388,10 @@ static void thread_func(void *userdata) {
                 ssize_t read;
 
                 for (i = 0; i < nbfds; i++) {
+                    if (pollfd->revents & POLLERR) {
+                        /* one of UDP fds is in faulty state, may have been disconnected, this is fatal  */
+                        goto fail;
+                    }
                     if (pollfd->revents & pollfd->events) {
                         pollfd->revents = 0;
                         read = pa_read(pollfd->fd, packet, sizeof(packet), NULL);
@@ -431,7 +435,7 @@ static void thread_func(void *userdata) {
                 /* Just try again. */
                 pa_log_debug("Failed to write data to FIFO (EINTR), retrying");
                 goto fail;
-            } else if (errno != EAGAIN) {
+            } else if (errno != EAGAIN && !u->oob) {
                 /* Buffer is full, wait for POLLOUT. */
                 pollfd->events = POLLOUT;
                 pollfd->revents = 0;