Skip to content

Commit f88eccc

Browse files
committed
iio:health:afe4404 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 40 byte array of smaller elements 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 explicitly requested. This data is allocated with kzalloc so no data can leak appart from previous readings. Fixes: 87aec56 ("iio: health: Add driver for the TI AFE4404 heart monitor") Reported-by: Lars-Peter Clausen <[email protected]> Signed-off-by: Jonathan Cameron <[email protected]> Acked-by: Andrew F. Davis <[email protected]> Signed-off-by: Jonathan Cameron <[email protected]>
1 parent 3f9c6d3 commit f88eccc

File tree

1 file changed

+5
-3
lines changed

1 file changed

+5
-3
lines changed

drivers/iio/health/afe4404.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ static const struct reg_field afe4404_reg_fields[] = {
8383
* @regulator: Pointer to the regulator for the IC
8484
* @trig: IIO trigger for this device
8585
* @irq: ADC_RDY line interrupt number
86+
* @buffer: Used to construct a scan to push to the iio buffer.
8687
*/
8788
struct afe4404_data {
8889
struct device *dev;
@@ -91,6 +92,7 @@ struct afe4404_data {
9192
struct regulator *regulator;
9293
struct iio_trigger *trig;
9394
int irq;
95+
s32 buffer[10] __aligned(8);
9496
};
9597

9698
enum afe4404_chan_id {
@@ -328,17 +330,17 @@ static irqreturn_t afe4404_trigger_handler(int irq, void *private)
328330
struct iio_dev *indio_dev = pf->indio_dev;
329331
struct afe4404_data *afe = iio_priv(indio_dev);
330332
int ret, bit, i = 0;
331-
s32 buffer[10];
332333

333334
for_each_set_bit(bit, indio_dev->active_scan_mask,
334335
indio_dev->masklength) {
335336
ret = regmap_read(afe->regmap, afe4404_channel_values[bit],
336-
&buffer[i++]);
337+
&afe->buffer[i++]);
337338
if (ret)
338339
goto err;
339340
}
340341

341-
iio_push_to_buffers_with_timestamp(indio_dev, buffer, pf->timestamp);
342+
iio_push_to_buffers_with_timestamp(indio_dev, afe->buffer,
343+
pf->timestamp);
342344
err:
343345
iio_trigger_notify_done(indio_dev->trig);
344346

0 commit comments

Comments
 (0)