mirror of
https://github.com/torvalds/linux.git
synced 2026-09-26 10:02:02 +02:00
platform/chrome: sensorhub: Fix memory overread in ring handler
`max_response` and `sensor_num` are read from different EC commands:
- `max_response` is from cros_ec_get_proto_info().
ec_dev->max_response = info->max_response_packet_size -
sizeof(struct ec_host_response);
- `sensor_num` is from cros_ec_get_sensor_count().
sensor_num = cros_ec_get_sensor_count(ec);
With a malfunctioning EC firmware, it is possible that the `msg->insize`
(i.e., `fifo_info_length` in the context) could be clamped in
cros_ec_cmd_xfer() because `msg->insize` is greater than `max_response`.
int fifo_info_length =
sizeof(struct ec_response_motion_sense_fifo_info) +
sizeof(u16) * sensorhub->sensor_num;
This means the number of read bytes could be less than expected. As a
result, the subsequent memcpy() in cros_ec_sensorhub_ring_handler()
overreads the `resp->fifo_info` buffer.
Check the return value of cros_ec_cmd_xfer_status() and abort if the
number of bytes read does not match the expected length.
Fixes: 145d59baff ("platform/chrome: cros_ec_sensorhub: Add FIFO support")
Reviewed-by: Tomasz Figa <tfiga@chromium.org>
Link: https://lore.kernel.org/r/20260702082745.1014968-1-tzungbi@kernel.org
Signed-off-by: Tzung-Bi Shih <tzungbi@kernel.org>
This commit is contained in:
parent
a0a8cd9fc9
commit
d1ceb2b232
|
|
@ -825,8 +825,15 @@ static void cros_ec_sensorhub_ring_handler(struct cros_ec_sensorhub *sensorhub)
|
|||
sensorhub->msg->outsize = 1;
|
||||
sensorhub->msg->insize = fifo_info_length;
|
||||
|
||||
if (cros_ec_cmd_xfer_status(ec->ec_dev, sensorhub->msg) < 0)
|
||||
ret = cros_ec_cmd_xfer_status(ec->ec_dev, sensorhub->msg);
|
||||
if (ret < 0)
|
||||
goto error;
|
||||
if (ret != fifo_info_length) {
|
||||
dev_warn_ratelimited(sensorhub->dev,
|
||||
"Mismatch read length: size %d - expected %d\n",
|
||||
ret, fifo_info_length);
|
||||
goto error;
|
||||
}
|
||||
|
||||
memcpy(fifo_info, &sensorhub->resp->fifo_info,
|
||||
fifo_info_length);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user