Skip to content

Commit f60e8bb

Browse files
committed
iio:proximity:mb1232: Fix timestamp alignment and prevent data leak.
One of a class of bugs pointed out by Lars in a recent review. iio_push_to_buffers_with_timestamp assumes the buffer used is aligned to the size of the timestamp (8 bytes). This is not guaranteed in this driver which uses a 16 byte s16 array on the stack As Lars also noted this anti pattern can involve a leak of data to userspace and that indeed can happen here. We close both issues by moving to a suitable structure in the iio_priv() data with alignment ensured by use of an explicit c structure. This data is allocated with kzalloc so no data can leak appart from previous readings. In this case the forced alignment of the ts is necessary to ensure correct padding on x86_32 where the s64 would only be 4 byte aligned. Fixes: 16b0526 ("mb1232.c: add distance iio sensor with i2c") Reported-by: Lars-Peter Clausen <lars@metafoo.de> Cc: Andreas Klinger <ak@it-klinger.de> Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com> Cc: <Stable@vger.kernel.org> Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
1 parent 7e5ac1f commit f60e8bb

File tree

1 file changed

+9
-8
lines changed

1 file changed

+9
-8
lines changed

drivers/iio/proximity/mb1232.c

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,11 @@ struct mb1232_data {
4040
*/
4141
struct completion ranging;
4242
int irqnr;
43+
/* Ensure correct alignment of data to push to IIO buffer */
44+
struct {
45+
s16 distance;
46+
s64 ts __aligned(8);
47+
} scan;
4348
};
4449

4550
static irqreturn_t mb1232_handle_irq(int irq, void *dev_id)
@@ -113,17 +118,13 @@ static irqreturn_t mb1232_trigger_handler(int irq, void *p)
113118
struct iio_poll_func *pf = p;
114119
struct iio_dev *indio_dev = pf->indio_dev;
115120
struct mb1232_data *data = iio_priv(indio_dev);
116-
/*
117-
* triggered buffer
118-
* 16-bit channel + 48-bit padding + 64-bit timestamp
119-
*/
120-
s16 buffer[8] = { 0 };
121121

122-
buffer[0] = mb1232_read_distance(data);
123-
if (buffer[0] < 0)
122+
data->scan.distance = mb1232_read_distance(data);
123+
if (data->scan.distance < 0)
124124
goto err;
125125

126-
iio_push_to_buffers_with_timestamp(indio_dev, buffer, pf->timestamp);
126+
iio_push_to_buffers_with_timestamp(indio_dev, &data->scan,
127+
pf->timestamp);
127128

128129
err:
129130
iio_trigger_notify_done(indio_dev->trig);

0 commit comments

Comments
 (0)