From ccc88607b60e7fad7be4fc26c7a0d47aeae3fe15 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= Date: Thu, 12 Nov 2020 00:25:34 +0100 Subject: [PATCH 1/4] Don't crash if alsa_snd_pcm_poll_descriptors fails --- src/hostapi/alsa/pa_linux_alsa.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/hostapi/alsa/pa_linux_alsa.c b/src/hostapi/alsa/pa_linux_alsa.c index 5539d9d..48d77c1 100644 --- a/src/hostapi/alsa/pa_linux_alsa.c +++ b/src/hostapi/alsa/pa_linux_alsa.c @@ -3642,8 +3642,11 @@ static PaError PaAlsaStreamComponent_BeginPolling( PaAlsaStreamComponent* self, PaError result = paNoError; int ret = alsa_snd_pcm_poll_descriptors( self->pcm, pfds, self->nfds ); (void)ret; /* Prevent unused variable warning if asserts are turned off */ - assert( ret == self->nfds ); - + /* If alsa returns anything else, like -EPIPE return*/ + if( ret != self->nfds ) + { + return paUnanticipatedHostError; + } self->ready = 0; return result; @@ -3810,7 +3813,12 @@ static PaError PaAlsaStream_WaitForFrames( PaAlsaStream *self, unsigned long *fr { /* self->pfds is in effect an array of fds; if necessary, index past the capture fds */ playbackPfds = self->pfds + (pollCapture ? self->capture.nfds : 0); - PA_ENSURE( PaAlsaStreamComponent_BeginPolling( &self->playback, playbackPfds ) ); + int res = PaAlsaStreamComponent_BeginPolling( &self->playback, playbackPfds ); + if( res != paNoError) + { + xrun = 1; + goto end; + } totalFds += self->playback.nfds; } From b37657be7081c8cd4dbb16f1f592082795dce776 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= Date: Fri, 27 Nov 2020 08:40:45 +0100 Subject: [PATCH 2/4] Remove superfluid void cast --- src/hostapi/alsa/pa_linux_alsa.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/hostapi/alsa/pa_linux_alsa.c b/src/hostapi/alsa/pa_linux_alsa.c index 48d77c1..0564351 100644 --- a/src/hostapi/alsa/pa_linux_alsa.c +++ b/src/hostapi/alsa/pa_linux_alsa.c @@ -3641,7 +3641,6 @@ static PaError PaAlsaStreamComponent_BeginPolling( PaAlsaStreamComponent* self, { PaError result = paNoError; int ret = alsa_snd_pcm_poll_descriptors( self->pcm, pfds, self->nfds ); - (void)ret; /* Prevent unused variable warning if asserts are turned off */ /* If alsa returns anything else, like -EPIPE return*/ if( ret != self->nfds ) { From 8f63b5180830ad3da103597305f4504fa4935148 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= Date: Mon, 14 Dec 2020 08:03:04 +0100 Subject: [PATCH 3/4] Don't crash for alsa_snd_pcm_poll_descriptors fail in another case --- src/hostapi/alsa/pa_linux_alsa.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/hostapi/alsa/pa_linux_alsa.c b/src/hostapi/alsa/pa_linux_alsa.c index 0564351..22c30f1 100644 --- a/src/hostapi/alsa/pa_linux_alsa.c +++ b/src/hostapi/alsa/pa_linux_alsa.c @@ -3805,14 +3805,19 @@ static PaError PaAlsaStream_WaitForFrames( PaAlsaStream *self, unsigned long *fr if( pollCapture ) { capturePfds = self->pfds; - PA_ENSURE( PaAlsaStreamComponent_BeginPolling( &self->capture, capturePfds ) ); + PaError res = PaAlsaStreamComponent_BeginPolling( &self->capture, capturePfds ); + if( res != paNoError) + { + xrun = 1; + goto end; + } totalFds += self->capture.nfds; } if( pollPlayback ) { /* self->pfds is in effect an array of fds; if necessary, index past the capture fds */ playbackPfds = self->pfds + (pollCapture ? self->capture.nfds : 0); - int res = PaAlsaStreamComponent_BeginPolling( &self->playback, playbackPfds ); + PaError res = PaAlsaStreamComponent_BeginPolling( &self->playback, playbackPfds ); if( res != paNoError) { xrun = 1; From 9ddb047ab1028add40e9499d2b1a5f1e78e70e6a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= Date: Mon, 14 Dec 2020 08:21:34 +0100 Subject: [PATCH 4/4] Improve code style --- src/hostapi/alsa/pa_linux_alsa.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/hostapi/alsa/pa_linux_alsa.c b/src/hostapi/alsa/pa_linux_alsa.c index 22c30f1..12aee58 100644 --- a/src/hostapi/alsa/pa_linux_alsa.c +++ b/src/hostapi/alsa/pa_linux_alsa.c @@ -3639,16 +3639,15 @@ error: */ static PaError PaAlsaStreamComponent_BeginPolling( PaAlsaStreamComponent* self, struct pollfd* pfds ) { - PaError result = paNoError; - int ret = alsa_snd_pcm_poll_descriptors( self->pcm, pfds, self->nfds ); - /* If alsa returns anything else, like -EPIPE return*/ - if( ret != self->nfds ) + int nfds = alsa_snd_pcm_poll_descriptors( self->pcm, pfds, self->nfds ); + /* If alsa returns anything else, like -EPIPE return */ + if( nfds != self->nfds ) { - return paUnanticipatedHostError; + return paUnanticipatedHostError; } self->ready = 0; - return result; + return paNoError; } /** Examine results from poll().