alsa-devel.alsa-project.org archive mirror
 help / color / mirror / Atom feed
* [TINYCOMPRESS][PATCH 1/1] compress: Must check for POLLERR before POLLOUT/POLLIN
@ 2013-08-29  8:32 Richard Fitzgerald
  2013-09-25 10:15 ` Vinod Koul
  0 siblings, 1 reply; 2+ messages in thread
From: Richard Fitzgerald @ 2013-08-29  8:32 UTC (permalink / raw)
  To: vinod.koul; +Cc: alsa-devel, pierre-louis.bossart, elaurent

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 <rf@opensource.wolfsonmicro.com>
---
 compress.c |   18 +++++++++---------
 1 files changed, 9 insertions(+), 9 deletions(-)

diff --git a/compress.c b/compress.c
index 0e71c28..5cd0966 100644
--- a/compress.c
+++ b/compress.c
@@ -378,6 +378,9 @@ int compress_write(struct compress *compress, const 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 writing */
 			if ((ret == 0) || (ret == -EBADFD))
@@ -387,9 +390,6 @@ int compress_write(struct compress *compress, const void *buf, unsigned int size
 			if (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;
 }
 
-- 
1.7.2.5

^ permalink raw reply related	[flat|nested] 2+ messages in thread

* Re: [TINYCOMPRESS][PATCH 1/1] compress: Must check for POLLERR before POLLOUT/POLLIN
  2013-08-29  8:32 [TINYCOMPRESS][PATCH 1/1] compress: Must check for POLLERR before POLLOUT/POLLIN Richard Fitzgerald
@ 2013-09-25 10:15 ` Vinod Koul
  0 siblings, 0 replies; 2+ messages in thread
From: Vinod Koul @ 2013-09-25 10:15 UTC (permalink / raw)
  To: Richard Fitzgerald; +Cc: alsa-devel, pierre-louis.bossart, elaurent

On Thu, Aug 29, 2013 at 09:32:02AM +0100, Richard Fitzgerald wrote:
> 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

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2013-09-25 11:06 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-08-29  8:32 [TINYCOMPRESS][PATCH 1/1] compress: Must check for POLLERR before POLLOUT/POLLIN Richard Fitzgerald
2013-09-25 10:15 ` Vinod Koul

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).