Skip to content

Commit

Permalink
staging:iio:kfifo_buf: Fix potential buffer overflow in iio_read_firs…
Browse files Browse the repository at this point in the history
…t_n_kfifo

n is the number of bytes to read, not the number of samples. So if there is
enough data available we will write to the userspace buffer beyond its bounds.
Fix this by copying n bytes maximum. Also round n down to the next multiple of
the sample size, so we will only read complete samples. If the buffer is too
small to hold at least one sample return -EINVAL.

Also update the documentation of read_first_n to reflect the fact that 'n' is
supposed to be in bytes and not in samples.

Acked-by: Jonathan Cameron <jic23@kernel.org>
Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
  • Loading branch information
Lars-Peter Clausen authored and Greg Kroah-Hartman committed Dec 13, 2011
1 parent 641b4bb commit 8fe6495
Show file tree
Hide file tree
Showing 2 changed files with 6 additions and 2 deletions.
2 changes: 1 addition & 1 deletion drivers/staging/iio/buffer.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ struct iio_buffer;
* @mark_in_use: reference counting, typically to prevent module removal
* @unmark_in_use: reduce reference count when no longer using buffer
* @store_to: actually store stuff to the buffer
* @read_first_n: try to get a specified number of elements (must exist)
* @read_first_n: try to get a specified number of bytes (must exist)
* @mark_param_change: notify buffer that some relevant parameter has changed
* Often this means the underlying storage may need to
* change.
Expand Down
6 changes: 5 additions & 1 deletion drivers/staging/iio/kfifo_buf.c
Original file line number Diff line number Diff line change
Expand Up @@ -160,7 +160,11 @@ static int iio_read_first_n_kfifo(struct iio_buffer *r,
int ret, copied;
struct iio_kfifo *kf = iio_to_kfifo(r);

ret = kfifo_to_user(&kf->kf, buf, r->bytes_per_datum*n, &copied);
if (n < r->bytes_per_datum)
return -EINVAL;

n = rounddown(n, r->bytes_per_datum);
ret = kfifo_to_user(&kf->kf, buf, n, &copied);

return copied;
}
Expand Down

0 comments on commit 8fe6495

Please sign in to comment.