FAILED: patch "[PATCH] iio: cros_ec: fix an use-after-free in" failed to apply to 6.1-stable tree
Subsystems (3)
[email protected]
maintainerThe patch below does not apply to the 6.1-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-6.1.y
git checkout FETCH_HEAD
git cherry-pick -x 7771c8c80d62ad065637ef74ed2962983f6c5f6d
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2023101526-sweep-stray-4f99@gregkh' --subject-prefix 'PATCH 6.1.y' HEAD^..
Possible dependencies:
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 7771c8c80d62ad065637ef74ed2962983f6c5f6d Mon Sep 17 00:00:00 2001
From: Tzung-Bi Shih <[email protected]>
Date: Tue, 29 Aug 2023 11:06:22 +0800
Subject: [PATCH] iio: cros_ec: fix an use-after-free in
cros_ec_sensors_push_data()
cros_ec_sensors_push_data() reads indio_dev->active_scan_mask and calls iio_push_to_buffers_with_timestamp() without making sure the indio_dev stays in buffer mode. There is a race if indio_dev exits buffer mode right before cros_ec_sensors_push_data() accesses them.
An use-after-free on indio_dev->active_scan_mask was observed. The call trace:
[...]
_find_next_bit
cros_ec_sensors_push_data
cros_ec_sensorhub_event
blocking_notifier_call_chain
cros_ec_irq_thread
It was caused by a race condition: one thread just freed active_scan_mask at [1]; while another thread tried to access the memory at [2].
Fix it by calling iio_device_claim_buffer_mode() to ensure the indio_dev can't exit buffer mode during cros_ec_sensors_push_data().
[1]: https://elixir.bootlin.com/linux/v6.5/source/drivers/iio/industrialio-buffer.c#L1189
[2]: https://elixir.bootlin.com/linux/v6.5/source/drivers/iio/common/cros_ec_sensors/cros_ec_sensors_core.c#L198
drivers/iio/common/cros_ec_sensors/cros_ec_sensors_core.c +5 -1
@@ -190,8 +190,11 @@ int cros_ec_sensors_push_data(struct iio_dev *indio_dev,/* * Ignore samples if the buffer is not set: it is needed if the ODR is * set but the buffer is not enabled yet. +* +* Note: iio_device_claim_buffer_mode() returns -EBUSY if the buffer +* is not enabled. */ -if (!iio_buffer_enabled (indio_dev)) +if (iio_device_claim_buffer_mode (indio_dev) <0 )return 0 ; out = (s16 *)st->samples;
@@ -210,6 +213,7 @@ int cros_ec_sensors_push_data(struct iio_dev *indio_dev,iio_push_to_buffers_with_timestamp (indio_dev, st->samples, timestamp + delta); +iio_device_release_buffer_mode (indio_dev);return 0 ; }EXPORT_SYMBOL_GPL (cros_ec_sensors_push_data);