summaryrefslogtreecommitdiff
path: root/include/linux/counter.h
diff options
context:
space:
mode:
authorWilliam Breathitt Gray <vilhelm.gray@gmail.com>2021-10-21 19:35:40 +0900
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2021-10-21 13:02:47 +0200
commit8ac33b8b6841e99a624ace543d92cbf598a91381 (patch)
treebfbb42f1f6f41bc9fb8cae0098746d382196ad67 /include/linux/counter.h
parent310e75c72fefa3b0b4535f669c8b37c963a2dba5 (diff)
counter: Fix use-after-free race condition for events_queue_size write
A race condition is possible when writing to events_queue_size where the events kfifo is freed during the execution of a kfifo_in(), resulting in a use-after-free. This patch prevents such a scenario by protecting the events queue in operation with a spinlock and locking before performing the events queue size adjustment. The existing events_lock mutex is renamed to events_out_lock to reflect that it only protects events queue out operations. Because the events queue in operations can occur in an interrupt context, a new events_in_lock spinlock is introduced and utilized. Fixes: feff17a550c7 ("counter: Implement events_queue_size sysfs attribute") Cc: David Lechner <david@lechnology.com> Signed-off-by: William Breathitt Gray <vilhelm.gray@gmail.com> Link: https://lore.kernel.org/r/20211021103540.955639-1-vilhelm.gray@gmail.com Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'include/linux/counter.h')
-rw-r--r--include/linux/counter.h6
1 files changed, 4 insertions, 2 deletions
diff --git a/include/linux/counter.h b/include/linux/counter.h
index 0fd99e255a50..b7d0a00a61cf 100644
--- a/include/linux/counter.h
+++ b/include/linux/counter.h
@@ -296,7 +296,8 @@ struct counter_ops {
* @n_events_list_lock: lock to protect Counter next events list operations
* @events: queue of detected Counter events
* @events_wait: wait queue to allow blocking reads of Counter events
- * @events_lock: lock to protect Counter events queue read operations
+ * @events_in_lock: lock to protect Counter events queue in operations
+ * @events_out_lock: lock to protect Counter events queue out operations
* @ops_exist_lock: lock to prevent use during removal
*/
struct counter_device {
@@ -323,7 +324,8 @@ struct counter_device {
struct mutex n_events_list_lock;
DECLARE_KFIFO_PTR(events, struct counter_event);
wait_queue_head_t events_wait;
- struct mutex events_lock;
+ spinlock_t events_in_lock;
+ struct mutex events_out_lock;
struct mutex ops_exist_lock;
};