@@ -130,6 +130,11 @@ int dispatch_hid_bpf_output_report(struct hid_device *hdev,
struct hid_bpf_ops *e;
int ret, idx;
+ if (unlikely(!hdev->bpf.srcu.sda)) {
+ hid_warn(hdev, "UAF srcu %p", &hdev->bpf.srcu);
+ return 0;
+ }
+
idx = srcu_read_lock(&hdev->bpf.srcu);
list_for_each_entry_srcu(e, &hdev->bpf.prog_list, list,
srcu_read_lock_held(&hdev->bpf.srcu)) {
@@ -143,6 +148,8 @@ int dispatch_hid_bpf_output_report(struct hid_device *hdev,
ret = 0;
out:
+ if (unlikely(!hdev->bpf.srcu.sda))
+ hid_warn(hdev, "RACE srcu %p", &hdev->bpf.srcu);
srcu_read_unlock(&hdev->bpf.srcu, idx);
return ret;
}
@@ -631,6 +638,7 @@ void hid_bpf_destroy_device(struct hid_device *hdev)
synchronize_srcu(&hdev->bpf.srcu);
cleanup_srcu_struct(&hdev->bpf.srcu);
+ hid_info(hdev, "CLEANED UP srcu %p", &hdev->bpf.srcu);
}
EXPORT_SYMBOL_GPL(hid_bpf_destroy_device);