Commit 6fd47eff authored by Benjamin Tissoires's avatar Benjamin Tissoires
Browse files

HID: bpf: allow write access to quirks field in struct hid_device



This allows to give more control from BPF during report descriptor fixup.
We already reset the quirks before calling ->probe(), so now we reset
it once before calling hid_bpf_rdesc_fixup().

Reviewed-by: default avatarPeter Hutterer <peter.hutterer@who-t.net>
Link: https://patch.msgid.link/20241001-hid-bpf-hid-generic-v3-4-2ef1019468df@kernel.org


Signed-off-by: default avatarBenjamin Tissoires <bentiss@kernel.org>
parent 7316fef4
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -79,6 +79,7 @@ static int hid_bpf_ops_btf_struct_access(struct bpf_verifier_log *log,
		WRITE_RANGE(hid_device, name, true),
		WRITE_RANGE(hid_device, uniq, true),
		WRITE_RANGE(hid_device, phys, true),
		WRITE_RANGE(hid_device, quirks, false),
	};
#undef WRITE_RANGE
	const struct btf_type *state = NULL;
+9 −2
Original line number Diff line number Diff line
@@ -2709,6 +2709,12 @@ static int __hid_device_probe(struct hid_device *hdev, struct hid_driver *hdrv)
	int ret;

	if (!hdev->bpf_rsize) {
		unsigned int quirks;

		/* reset the quirks that has been previously set */
		quirks = hid_lookup_quirk(hdev);
		hdev->quirks = quirks;

		/* in case a bpf program gets detached, we need to free the old one */
		hid_free_bpf_rdesc(hdev);

@@ -2718,6 +2724,9 @@ static int __hid_device_probe(struct hid_device *hdev, struct hid_driver *hdrv)
		/* call_hid_bpf_rdesc_fixup will always return a valid pointer */
		hdev->bpf_rdesc = call_hid_bpf_rdesc_fixup(hdev, hdev->dev_rdesc,
							   &hdev->bpf_rsize);
		if (quirks ^ hdev->quirks)
			hid_info(hdev, "HID-BPF toggled quirks on the device: %04x",
				 quirks ^ hdev->quirks);
	}

	if (!hid_check_device_match(hdev, hdrv, &id))
@@ -2727,8 +2736,6 @@ static int __hid_device_probe(struct hid_device *hdev, struct hid_driver *hdrv)
	if (!hdev->devres_group_id)
		return -ENOMEM;

	/* reset the quirks that has been previously set */
	hdev->quirks = hid_lookup_quirk(hdev);
	hdev->driver = hdrv;

	if (hdrv->probe) {