From 30eb82f05dd1f12b18a0ad054401a0b5690fb3c3 Mon Sep 17 00:00:00 2001 From: Jonathan Cameron Date: Wed, 21 Sep 2011 11:16:02 +0100 Subject: [PATCH] staging:iio: Prevent reading from buffer chrdev when device has no buffer. Silly bug introduced during the chrdev merge series. Signed-off-by: Jonathan Cameron Signed-off-by: Greg Kroah-Hartman --- drivers/staging/iio/iio_core.h | 9 ++++++--- drivers/staging/iio/industrialio-buffer.c | 8 +++++--- drivers/staging/iio/industrialio-core.c | 4 ++-- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/drivers/staging/iio/iio_core.h b/drivers/staging/iio/iio_core.h index dde9e3e4278..36159e0dbfc 100644 --- a/drivers/staging/iio/iio_core.h +++ b/drivers/staging/iio/iio_core.h @@ -33,7 +33,7 @@ int __iio_add_chan_devattr(const char *postfix, #ifdef CONFIG_IIO_BUFFER struct poll_table_struct; -void iio_chrdev_buffer_open(struct iio_dev *indio_dev); +int iio_chrdev_buffer_open(struct iio_dev *indio_dev); void iio_chrdev_buffer_release(struct iio_dev *indio_dev); unsigned int iio_buffer_poll(struct file *filp, @@ -47,8 +47,11 @@ ssize_t iio_buffer_read_first_n_outer(struct file *filp, char __user *buf, #else -static inline void iio_chrdev_buffer_open(struct iio_dev *indio_dev) -{} +static inline int iio_chrdev_buffer_open(struct iio_dev *indio_dev) +{ + return -EINVAL; +} + static inline void iio_chrdev_buffer_release(struct iio_dev *indio_dev) {} diff --git a/drivers/staging/iio/industrialio-buffer.c b/drivers/staging/iio/industrialio-buffer.c index c3f57e7e808..4ce101af9a9 100644 --- a/drivers/staging/iio/industrialio-buffer.c +++ b/drivers/staging/iio/industrialio-buffer.c @@ -63,11 +63,14 @@ unsigned int iio_buffer_poll(struct file *filp, return 0; } -void iio_chrdev_buffer_open(struct iio_dev *indio_dev) +int iio_chrdev_buffer_open(struct iio_dev *indio_dev) { struct iio_buffer *rb = indio_dev->buffer; - if (rb && rb->access->mark_in_use) + if (!rb) + return -EINVAL; + if (rb->access->mark_in_use) rb->access->mark_in_use(rb); + return 0; } void iio_chrdev_buffer_release(struct iio_dev *indio_dev) @@ -77,7 +80,6 @@ void iio_chrdev_buffer_release(struct iio_dev *indio_dev) clear_bit(IIO_BUSY_BIT_POS, &rb->flags); if (rb->access->unmark_in_use) rb->access->unmark_in_use(rb); - } void iio_buffer_init(struct iio_buffer *buffer, struct iio_dev *dev_info) diff --git a/drivers/staging/iio/industrialio-core.c b/drivers/staging/iio/industrialio-core.c index b11c7f303ac..647a4052a8c 100644 --- a/drivers/staging/iio/industrialio-core.c +++ b/drivers/staging/iio/industrialio-core.c @@ -1065,8 +1065,8 @@ static int iio_chrdev_open(struct inode *inode, struct file *filp) struct iio_dev *dev_info = container_of(inode->i_cdev, struct iio_dev, chrdev); filp->private_data = dev_info; - iio_chrdev_buffer_open(dev_info); - return 0; + + return iio_chrdev_buffer_open(dev_info); } /** -- 2.11.4.GIT