Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c043ec1c authored by Martin Kelly's avatar Martin Kelly Committed by Jonathan Cameron
Browse files

iio:buffer: make length types match kfifo types



Currently, we use int for buffer length and bytes_per_datum. However,
kfifo uses unsigned int for length and size_t for element size. We need
to make sure these matches or we will have bugs related to overflow (in
the range between INT_MAX and UINT_MAX for length, for example).

In addition, set_bytes_per_datum uses size_t while bytes_per_datum is an
int, which would cause bugs for large values of bytes_per_datum.

Change buffer length to use unsigned int and bytes_per_datum to use
size_t.

Signed-off-by: default avatarMartin Kelly <mkelly@xevo.com>
Cc: <Stable@vger.kernel.org>
Signed-off-by: default avatarJonathan Cameron <Jonathan.Cameron@huawei.com>
parent d58109dc
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -587,7 +587,7 @@ EXPORT_SYMBOL_GPL(iio_dma_buffer_set_bytes_per_datum);
 * Should be used as the set_length callback for iio_buffer_access_ops
 * Should be used as the set_length callback for iio_buffer_access_ops
 * struct for DMA buffers.
 * struct for DMA buffers.
 */
 */
int iio_dma_buffer_set_length(struct iio_buffer *buffer, int length)
int iio_dma_buffer_set_length(struct iio_buffer *buffer, unsigned int length)
{
{
	/* Avoid an invalid state */
	/* Avoid an invalid state */
	if (length < 2)
	if (length < 2)
+2 −2
Original line number Original line Diff line number Diff line
@@ -22,7 +22,7 @@ struct iio_kfifo {
#define iio_to_kfifo(r) container_of(r, struct iio_kfifo, buffer)
#define iio_to_kfifo(r) container_of(r, struct iio_kfifo, buffer)


static inline int __iio_allocate_kfifo(struct iio_kfifo *buf,
static inline int __iio_allocate_kfifo(struct iio_kfifo *buf,
				int bytes_per_datum, int length)
			size_t bytes_per_datum, unsigned int length)
{
{
	if ((length == 0) || (bytes_per_datum == 0))
	if ((length == 0) || (bytes_per_datum == 0))
		return -EINVAL;
		return -EINVAL;
@@ -67,7 +67,7 @@ static int iio_set_bytes_per_datum_kfifo(struct iio_buffer *r, size_t bpd)
	return 0;
	return 0;
}
}


static int iio_set_length_kfifo(struct iio_buffer *r, int length)
static int iio_set_length_kfifo(struct iio_buffer *r, unsigned int length)
{
{
	/* Avoid an invalid state */
	/* Avoid an invalid state */
	if (length < 2)
	if (length < 2)
+3 −3
Original line number Original line Diff line number Diff line
@@ -53,7 +53,7 @@ struct iio_buffer_access_funcs {
	int (*request_update)(struct iio_buffer *buffer);
	int (*request_update)(struct iio_buffer *buffer);


	int (*set_bytes_per_datum)(struct iio_buffer *buffer, size_t bpd);
	int (*set_bytes_per_datum)(struct iio_buffer *buffer, size_t bpd);
	int (*set_length)(struct iio_buffer *buffer, int length);
	int (*set_length)(struct iio_buffer *buffer, unsigned int length);


	int (*enable)(struct iio_buffer *buffer, struct iio_dev *indio_dev);
	int (*enable)(struct iio_buffer *buffer, struct iio_dev *indio_dev);
	int (*disable)(struct iio_buffer *buffer, struct iio_dev *indio_dev);
	int (*disable)(struct iio_buffer *buffer, struct iio_dev *indio_dev);
@@ -72,10 +72,10 @@ struct iio_buffer_access_funcs {
 */
 */
struct iio_buffer {
struct iio_buffer {
	/** @length: Number of datums in buffer. */
	/** @length: Number of datums in buffer. */
	int length;
	unsigned int length;


	/**  @bytes_per_datum: Size of individual datum including timestamp. */
	/**  @bytes_per_datum: Size of individual datum including timestamp. */
	int bytes_per_datum;
	size_t bytes_per_datum;


	/**
	/**
	 * @access: Buffer access functions associated with the
	 * @access: Buffer access functions associated with the