All of lore.kernel.org
 help / color / mirror / Atom feed
From: Qasim Ijaz <qasdev00@gmail.com>
To: ping.cheng@wacom.com, jason.gerecke@wacom.com, jikos@kernel.org,
	bentiss@kernel.org
Cc: linux-input@vger.kernel.org, linux-kernel@vger.kernel.org,
	syzbot <syzbot+d5204cbbdd921f1f7cad@syzkaller.appspotmail.com>,
	stable@vger.kernel.org
Subject: [PATCH] HID: wacom: fix shift OOB in kfifo allocation for zero pktlen
Date: Tue,  1 Apr 2025 13:59:12 +0100	[thread overview]
Message-ID: <20250401125912.73044-1-qasdev00@gmail.com> (raw)

During wacom_parse_and_register() the code calls wacom_devm_kfifo_alloc 
to allocate a fifo. During this operation it passes kfifo_alloc a 
fifo_size of 0. Kfifo attempts to round the size passed to it to the 
next power of 2 via roundup_pow_of_two (queue-type data structures
do this to maintain efficiency of operations). 

However during this phase a problem arises when the roundup_pow_of_two() 
function utilises a shift exponent of fls_long(n-1), where n is the 
fifo_size. Since n is 0 in this case and n is also an unsigned long, 
doing n-1 causes unsigned integer wrap-around to occur making the 
fifo_size 4294967295. So the code effectively does fls_long(4294967295) 
which results in 64. Returning back to roundup_pow_of_two(), the code 
utilises a shift exponent of 64. When a shift exponent of 64 is used 
on a 64-bit type such as 1UL it results in a shift-out-of-bounds.

The root cause of the issue seems to stem from insufficient validation 
of wacom_compute_pktlen(), since in this case the fifo_size comes 
from wacom_wac->features.pktlen. During wacom_parse_and_register() 
the wacom_compute_pktlen() function sets the pktlen as 0.

To fix this, we should handle cases where wacom_compute_pktlen() 
results in 0.

Reported-by: syzbot <syzbot+d5204cbbdd921f1f7cad@syzkaller.appspotmail.com>
Closes: https://syzkaller.appspot.com/bug?extid=d5204cbbdd921f1f7cad
Tested-by: Qasim Ijaz <qasdev00@gmail.com>
Cc: stable@vger.kernel.org
Signed-off-by: Qasim Ijaz <qasdev00@gmail.com>
---
 drivers/hid/wacom_sys.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/hid/wacom_sys.c b/drivers/hid/wacom_sys.c
index 97393a3083ca..9b2f3dbca467 100644
--- a/drivers/hid/wacom_sys.c
+++ b/drivers/hid/wacom_sys.c
@@ -2361,6 +2361,8 @@ static int wacom_parse_and_register(struct wacom *wacom, bool wireless)
 	unsigned int connect_mask = HID_CONNECT_HIDRAW;
 
 	features->pktlen = wacom_compute_pktlen(hdev);
+	if (!features->pktlen)
+		return -ENODEV;
 
 	if (!devres_open_group(&hdev->dev, wacom, GFP_KERNEL))
 		return -ENOMEM;
-- 
2.39.5


             reply	other threads:[~2025-04-01 12:59 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-04-01 12:59 Qasim Ijaz [this message]
2025-04-01 19:06 ` [PATCH] HID: wacom: fix shift OOB in kfifo allocation for zero pktlen Gerecke, Jason

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=20250401125912.73044-1-qasdev00@gmail.com \
    --to=qasdev00@gmail.com \
    --cc=bentiss@kernel.org \
    --cc=jason.gerecke@wacom.com \
    --cc=jikos@kernel.org \
    --cc=linux-input@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=ping.cheng@wacom.com \
    --cc=stable@vger.kernel.org \
    --cc=syzbot+d5204cbbdd921f1f7cad@syzkaller.appspotmail.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.