diff options
author | Benjamin Tissoires <bentiss@kernel.org> | 2024-07-23 18:21:53 +0200 |
---|---|---|
committer | Benjamin Tissoires <bentiss@kernel.org> | 2024-07-24 18:27:21 +0200 |
commit | acd34cfc48b3dd46e5e4c4bdc99cc0c15568bac0 (patch) | |
tree | 849436a46a6031b01a8d3c212240e77e0010477e | |
parent | selftests/hid: disable struct_ops auto-attach (diff) | |
download | linux-acd34cfc48b3dd46e5e4c4bdc99cc0c15568bac0.tar.xz linux-acd34cfc48b3dd46e5e4c4bdc99cc0c15568bac0.zip |
HID: bpf: prevent the same struct_ops to be attached more than once
If the struct_ops is already attached, we should bail out or we will
end up in various locks and pointer issues while unregistering.
Link: https://patch.msgid.link/20240723-fix-6-11-bpf-v1-3-b9d770346784@kernel.org
Signed-off-by: Benjamin Tissoires <bentiss@kernel.org>
-rw-r--r-- | drivers/hid/bpf/hid_bpf_struct_ops.c | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/drivers/hid/bpf/hid_bpf_struct_ops.c b/drivers/hid/bpf/hid_bpf_struct_ops.c index f59cce6e437f..cd696c59ba0f 100644 --- a/drivers/hid/bpf/hid_bpf_struct_ops.c +++ b/drivers/hid/bpf/hid_bpf_struct_ops.c @@ -183,6 +183,10 @@ static int hid_bpf_reg(void *kdata, struct bpf_link *link) struct hid_device *hdev; int count, err = 0; + /* prevent multiple attach of the same struct_ops */ + if (ops->hdev) + return -EINVAL; + hdev = hid_get_device(ops->hid_id); if (IS_ERR(hdev)) return PTR_ERR(hdev); @@ -248,6 +252,7 @@ static void hid_bpf_unreg(void *kdata, struct bpf_link *link) list_del_rcu(&ops->list); synchronize_srcu(&hdev->bpf.srcu); + ops->hdev = NULL; reconnect = hdev->bpf.rdesc_ops == ops; if (reconnect) |