Skip to content

Commit 3f9c6d3

Browse files
committed
iio:health:afe4403 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 32 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: eec96d1 ("iio: health: Add driver for the TI AFE4403 heart monitor") Reported-by: Lars-Peter Clausen <[email protected]> Signed-off-by: Jonathan Cameron <[email protected]> Acked-by: Andrew F. Davis <[email protected]> Cc: <[email protected]> Signed-off-by: Jonathan Cameron <[email protected]>
1 parent b791d1b commit 3f9c6d3

File tree

1 file changed

+6
-3
lines changed

1 file changed

+6
-3
lines changed

drivers/iio/health/afe4403.c

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ static const struct reg_field afe4403_reg_fields[] = {
6565
* @regulator: Pointer to the regulator for the IC
6666
* @trig: IIO trigger for this device
6767
* @irq: ADC_RDY line interrupt number
68+
* @buffer: Used to construct data layout to push into IIO buffer.
6869
*/
6970
struct afe4403_data {
7071
struct device *dev;
@@ -74,6 +75,8 @@ struct afe4403_data {
7475
struct regulator *regulator;
7576
struct iio_trigger *trig;
7677
int irq;
78+
/* Ensure suitable alignment for timestamp */
79+
s32 buffer[8] __aligned(8);
7780
};
7881

7982
enum afe4403_chan_id {
@@ -309,7 +312,6 @@ static irqreturn_t afe4403_trigger_handler(int irq, void *private)
309312
struct iio_dev *indio_dev = pf->indio_dev;
310313
struct afe4403_data *afe = iio_priv(indio_dev);
311314
int ret, bit, i = 0;
312-
s32 buffer[8];
313315
u8 tx[4] = {AFE440X_CONTROL0, 0x0, 0x0, AFE440X_CONTROL0_READ};
314316
u8 rx[3];
315317

@@ -326,7 +328,7 @@ static irqreturn_t afe4403_trigger_handler(int irq, void *private)
326328
if (ret)
327329
goto err;
328330

329-
buffer[i++] = get_unaligned_be24(&rx[0]);
331+
afe->buffer[i++] = get_unaligned_be24(&rx[0]);
330332
}
331333

332334
/* Disable reading from the device */
@@ -335,7 +337,8 @@ static irqreturn_t afe4403_trigger_handler(int irq, void *private)
335337
if (ret)
336338
goto err;
337339

338-
iio_push_to_buffers_with_timestamp(indio_dev, buffer, pf->timestamp);
340+
iio_push_to_buffers_with_timestamp(indio_dev, afe->buffer,
341+
pf->timestamp);
339342
err:
340343
iio_trigger_notify_done(indio_dev->trig);
341344

0 commit comments

Comments
 (0)