diff options
author | Jonathan Cameron <jic23@cam.ac.uk> | 2011-09-21 11:16:02 +0100 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2011-09-26 17:31:56 -0700 |
commit | 30eb82f05dd1f12b18a0ad054401a0b5690fb3c3 (patch) | |
tree | 2970468c533272e6d840fb42ab3aff0636655040 | |
parent | ad31d250bf60c8e4c990e8b0daeedbaa2d6884a9 (diff) |
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 <jic23@cam.ac.uk>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
-rw-r--r-- | drivers/staging/iio/iio_core.h | 9 | ||||
-rw-r--r-- | drivers/staging/iio/industrialio-buffer.c | 8 | ||||
-rw-r--r-- | 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); } /** |