Skip to content

Commit 89226a2

Browse files
committed
iio:accel:mma8452: 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 u8 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. The additional forcing of the 8 byte alignment of the timestamp is not strictly necessary but makes the code less fragile by making this explicit. Fixes: c7eeea9 ("iio: Add Freescale MMA8452Q 3-axis accelerometer driver") Reported-by: Lars-Peter Clausen <lars@metafoo.de> Cc: Peter Meerwald <pmeerw@pmeerw.net> Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com> Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com> Cc: <Stable@vger.kernel.org>
1 parent 95ad675 commit 89226a2

File tree

1 file changed

+8
-3
lines changed

1 file changed

+8
-3
lines changed

drivers/iio/accel/mma8452.c

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,12 @@ struct mma8452_data {
110110
int sleep_val;
111111
struct regulator *vdd_reg;
112112
struct regulator *vddio_reg;
113+
114+
/* Ensure correct alignment of time stamp when present */
115+
struct {
116+
__be16 channels[3];
117+
s64 ts __aligned(8);
118+
} buffer;
113119
};
114120

115121
/**
@@ -1091,14 +1097,13 @@ static irqreturn_t mma8452_trigger_handler(int irq, void *p)
10911097
struct iio_poll_func *pf = p;
10921098
struct iio_dev *indio_dev = pf->indio_dev;
10931099
struct mma8452_data *data = iio_priv(indio_dev);
1094-
u8 buffer[16]; /* 3 16-bit channels + padding + ts */
10951100
int ret;
10961101

1097-
ret = mma8452_read(data, (__be16 *)buffer);
1102+
ret = mma8452_read(data, data->buffer.channels);
10981103
if (ret < 0)
10991104
goto done;
11001105

1101-
iio_push_to_buffers_with_timestamp(indio_dev, buffer,
1106+
iio_push_to_buffers_with_timestamp(indio_dev, &data->buffer,
11021107
iio_get_time_ns(indio_dev));
11031108

11041109
done:

0 commit comments

Comments
 (0)