From: Benjamin Tissoires <bentiss@kernel.org>
To: Jiri Kosina <jikos@kernel.org>,
Peter Hutterer <peter.hutterer@who-t.net>,
Vicki Pfau <vi@endrift.com>, Shuah Khan <shuah@kernel.org>
Cc: linux-input@vger.kernel.org, linux-kselftest@vger.kernel.org,
linux-kernel@vger.kernel.org, bpf@vger.kernel.org,
Benjamin Tissoires <bentiss@kernel.org>
Subject: [PATCH HID v2 03/11] HID: core: remove one more kmemdup on .probe()
Date: Tue, 10 Sep 2024 23:43:39 +0900 [thread overview]
Message-ID: <20240910-hid-bpf-hid-generic-v2-3-083dfc189e97@kernel.org> (raw)
In-Reply-To: <20240910-hid-bpf-hid-generic-v2-0-083dfc189e97@kernel.org>
That last kmemdup while opening the report descriptor was required to
have a common kfree() on it.
Move that kmemdup in the only special case it's required (if there is a
.report_fixup()), and add a more elaborated check before freeing
hdev->rdesc, to avoid a double free.
Signed-off-by: Benjamin Tissoires <bentiss@kernel.org>
---
new in v2
---
drivers/hid/hid-core.c | 28 ++++++++++++++++++++--------
1 file changed, 20 insertions(+), 8 deletions(-)
diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c
index 172746a082f9..2b70a12a2135 100644
--- a/drivers/hid/hid-core.c
+++ b/drivers/hid/hid-core.c
@@ -685,7 +685,14 @@ static void hid_close_report(struct hid_device *device)
INIT_LIST_HEAD(&report_enum->report_list);
}
- kfree(device->rdesc);
+ /*
+ * If the HID driver had a rdesc_fixup() callback, dev->rdesc
+ * will be allocated by hid-core and needs to be freed.
+ * Otherwise, it is either equal to dev_rdesc or bpf_rdesc, in
+ * which cases it'll be freed later on device removal or destroy.
+ */
+ if (device->rdesc != device->dev_rdesc && device->rdesc != device->bpf_rdesc)
+ kfree(device->rdesc);
device->rdesc = NULL;
device->rsize = 0;
@@ -1206,7 +1213,6 @@ int hid_open_report(struct hid_device *device)
struct hid_item item;
unsigned int size;
const __u8 *start;
- __u8 *buf = NULL;
const __u8 *end;
const __u8 *next;
int ret;
@@ -1233,17 +1239,23 @@ int hid_open_report(struct hid_device *device)
* on a copy of our report descriptor so it can
* change it.
*/
- buf = kmemdup(start, size, GFP_KERNEL);
+ __u8 *buf = kmemdup(start, size, GFP_KERNEL);
+
if (buf == NULL)
return -ENOMEM;
start = device->driver->report_fixup(device, buf, &size);
- }
- start = kmemdup(start, size, GFP_KERNEL);
- kfree(buf);
- if (start == NULL)
- return -ENOMEM;
+ /*
+ * The second kmemdup is required in case report_fixup() returns
+ * a static read-only memory, but we have no idea if that memory
+ * needs to be cleaned up or not at the end.
+ */
+ start = kmemdup(start, size, GFP_KERNEL);
+ kfree(buf);
+ if (start == NULL)
+ return -ENOMEM;
+ }
device->rdesc = start;
device->rsize = size;
--
2.46.0
next prev parent reply other threads:[~2024-09-10 14:43 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-09-10 14:43 [PATCH HID v2 00/11] HID: bpf: add a new hook to control hid-generic Benjamin Tissoires
2024-09-10 14:43 ` [PATCH HID v2 01/11] HID: bpf: move HID-BPF report descriptor fixup earlier Benjamin Tissoires
2024-09-10 14:43 ` [PATCH HID v2 02/11] HID: core: save one kmemdup during .probe() Benjamin Tissoires
2024-09-12 6:10 ` Peter Hutterer
2024-09-10 14:43 ` Benjamin Tissoires [this message]
2024-09-10 14:43 ` [PATCH HID v2 04/11] HID: bpf: allow write access to quirks field in struct hid_device Benjamin Tissoires
2024-09-10 14:43 ` [PATCH HID v2 05/11] selftests/hid: add dependency on hid_common.h Benjamin Tissoires
2024-09-10 14:43 ` [PATCH HID v2 06/11] selftests/hid: cleanup C tests by adding a common struct uhid_device Benjamin Tissoires
2024-09-10 14:43 ` [PATCH HID v2 07/11] selftests/hid: allow to parametrize bus/vid/pid/rdesc on the test device Benjamin Tissoires
2024-09-10 14:43 ` [PATCH HID v2 08/11] HID: add per device quirk to force bind to hid-generic Benjamin Tissoires
2024-09-12 6:13 ` Peter Hutterer
2024-09-10 14:43 ` [PATCH HID v2 09/11] selftests/hid: add test for assigning a given device " Benjamin Tissoires
2024-09-10 14:43 ` [PATCH HID v2 10/11] HID: add quirk to prevent hid-input to be used Benjamin Tissoires
2024-09-10 14:43 ` [PATCH HID v2 11/11] selftests/hid: add test to disable hid-input Benjamin Tissoires
2024-09-13 13:38 ` (subset) [PATCH HID v2 00/11] HID: bpf: add a new hook to control hid-generic Benjamin Tissoires
2024-09-13 13:47 ` Benjamin Tissoires
2024-09-14 5:26 ` Benjamin Tissoires
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20240910-hid-bpf-hid-generic-v2-3-083dfc189e97@kernel.org \
--to=bentiss@kernel.org \
--cc=bpf@vger.kernel.org \
--cc=jikos@kernel.org \
--cc=linux-input@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-kselftest@vger.kernel.org \
--cc=peter.hutterer@who-t.net \
--cc=shuah@kernel.org \
--cc=vi@endrift.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.