compress: Must check for POLLERR before POLLOUT/POLLIN
PATCH 1/1 compress: Must check for POLLERR before POLLOUT/POLLIN
In the case of error the ALSA compressed driver sets revents as (POLLOUT | POLLWRNORM | POLLERR) or (POLLIN | POLLWRNORM | POLLERR). So we can't assume that POLLOUT or POLLIN indicate success, we must check for POLLERR first.
Signed-off-by Richard Fitzgerald <[email protected]>
--- compress.c | 18 +++++++++--------- 1 files changed, 9 insertions(+), 9 deletions(-)
compress.c +9 -9
@@ -378,6 +378,9 @@ int compress_write(struct compress *compress, const void *buf, unsigned int sizereturn total; ret =poll (&fds,1 , compress->max_poll_wait_ms); +if (fds.revents &POLLERR ) { +return oops (compress,EIO ,"poll returned error!" ); + }/* A pause will cause -EBADFD or zero. * This is not an error, just stop writing */ if ((ret ==0 ) || (ret == -EBADFD ))
@@ -387,9 +390,6 @@ int compress_write(struct compress *compress, const void *buf, unsigned int sizeif (fds.revents &POLLOUT ) {continue ; } -if (fds.revents &POLLERR ) { -return oops (compress,EIO ,"poll returned error!" ); - } }/* write avail bytes */ if (size > avail.avail)
@@ -438,6 +438,9 @@ int compress_read(struct compress *compress, void *buf, unsigned int size)return total; ret =poll (&fds,1 , compress->max_poll_wait_ms); +if (fds.revents &POLLERR ) { +return oops (compress,EIO ,"poll returned error!" ); + }/* A pause will cause -EBADFD or zero. * This is not an error, just stop reading */ if ((ret ==0 ) || (ret == -EBADFD ))
@@ -447,9 +450,6 @@ int compress_read(struct compress *compress, void *buf, unsigned int size)if (fds.revents &POLLIN ) {continue ; } -if (fds.revents &POLLERR ) { -return oops (compress,EIO ,"poll returned error!" ); - } }/* read avail bytes */ if (size > avail.avail)
@@ -616,15 +616,15 @@ int compress_wait(struct compress *compress, int timeout_ms) fds.events =POLLOUT |POLLIN ; ret =poll (&fds,1 , timeout_ms); +if (fds.revents &POLLERR ) { +return oops (compress,EIO ,"poll returned error!" ); + }/* A pause will cause -EBADFD or zero. */ if ((ret <0 ) && (ret != -EBADFD ))return oops (compress, errno,"poll error" );if (fds.revents & (POLLOUT |POLLIN )) {return 0 ; } -if (fds.revents &POLLERR ) { -return oops (compress,EIO ,"poll returned error!" ); - }return ret; }
Signature · 1 line
1.7.2.5
Vinod Koul
AppliedQuoted 4 lines · Richard Fitzgerald
In the case of error the ALSA compressed driver sets revents as (POLLOUT | POLLWRNORM | POLLERR) or (POLLIN | POLLWRNORM | POLLERR). So we can't assume that POLLOUT or POLLIN indicate success, we must check for POLLERR first.
Applied, thanks
Sorry looks like I missed this earlier...
~Vinod