diff options
author | Jarod Wilson <jarod@redhat.com> | 2011-03-04 23:53:05 +0100 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2011-03-22 23:24:21 +0100 |
commit | cc664ae026f1b0f3254564a7d45cc29e735c7fed (patch) | |
tree | a2c0eaa8ffbac79aa0eea591dfb0eb82f7282430 | |
parent | [media] lirc: silence some compile warnings (diff) | |
download | linux-cc664ae026f1b0f3254564a7d45cc29e735c7fed.tar.xz linux-cc664ae026f1b0f3254564a7d45cc29e735c7fed.zip |
[media] lirc_zilog: error out if buffer read bytes != chunk size
Give it a few tries, then exit. Prevents a possible endless loop
situation.
Signed-off-by: Jarod Wilson <jarod@redhat.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
-rw-r--r-- | drivers/staging/lirc/lirc_zilog.c | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/drivers/staging/lirc/lirc_zilog.c b/drivers/staging/lirc/lirc_zilog.c index 407d4b409a8b..dd6a57c3c3a3 100644 --- a/drivers/staging/lirc/lirc_zilog.c +++ b/drivers/staging/lirc/lirc_zilog.c @@ -897,7 +897,7 @@ static ssize_t read(struct file *filep, char *outbuf, size_t n, loff_t *ppos) struct IR *ir = filep->private_data; struct IR_rx *rx; struct lirc_buffer *rbuf = ir->l.rbuf; - int ret = 0, written = 0; + int ret = 0, written = 0, retries = 0; unsigned int m; DECLARE_WAITQUEUE(wait, current); @@ -950,6 +950,12 @@ static ssize_t read(struct file *filep, char *outbuf, size_t n, loff_t *ppos) ret = copy_to_user((void *)outbuf+written, buf, rbuf->chunk_size); written += rbuf->chunk_size; + } else { + retries++; + } + if (retries >= 5) { + zilog_error("Buffer read failed!\n"); + ret = -EIO; } } } |