summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Chung <nickchung@google.com>2023-03-28 06:11:38 +0000
committerNick Chung <nickchung@google.com>2023-03-28 06:11:38 +0000
commit676c16df8585f0b8178dc5c22fee18033ea03ec8 (patch)
tree67510ff7fe011860773f4baa11fd04ebcbcc316b
parent2bda1c9518373563be560d9e933ce4ce9f3270d6 (diff)
downloadlwis-676c16df8585f0b8178dc5c22fee18033ea03ec8.tar.gz
The event_subscriber_list is used to subscribe and unsubscribe from events. The list may be removed before it is unsubscribed from, so it must be protected by a Spinlock to prevent data corruption. Bug: 239867994 Test: Fuzzing test. GCA Change-Id: Ibc8c2b218e16e5300bc68a3e4281fc0ba53adf62 Signed-off-by: Nick Chung <nickchung@google.com>
-rw-r--r--lwis_device_top.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/lwis_device_top.c b/lwis_device_top.c
index c5de1ed..6c72371 100644
--- a/lwis_device_top.c
+++ b/lwis_device_top.c
@@ -215,13 +215,14 @@ static int lwis_top_event_subscribe(struct lwis_device *lwis_dev, int64_t trigge
return -EINVAL;
}
+ spin_lock_irqsave(&lwis_top_dev->base_dev.lock, flags);
event_subscriber_list = event_subscriber_list_find_or_create(lwis_dev, trigger_event_id);
if (!event_subscriber_list) {
+ spin_unlock_irqrestore(&lwis_top_dev->base_dev.lock, flags);
dev_err(lwis_dev->dev, "Can't find/create event subscriber list\n");
return -EINVAL;
}
- spin_lock_irqsave(&lwis_top_dev->base_dev.lock, flags);
list_for_each (it_event_subscriber, &event_subscriber_list->list) {
old_subscription = list_entry(it_event_subscriber, struct lwis_event_subscribe_info,
list_node);