Linux Input/HID development
 help / color / mirror / Atom feed
From: sashiko-bot@kernel.org
To: "Jiangshan Yi" <yijiangshan@kylinos.cn>
Cc: dmitry.torokhov@gmail.com, linux-input@vger.kernel.org
Subject: Re: [PATCH] HID: nintendo: register input device after capabilities are set
Date: Thu, 30 Jul 2026 10:44:41 +0000	[thread overview]
Message-ID: <20260730104441.F422E1F00AC4@smtp.kernel.org> (raw)
In-Reply-To: <20260730101506.547340-1-yijiangshan@kylinos.cn>

Thank you for your contribution! Sashiko AI review found 4 potential issue(s) to consider:

Pre-existing issues:
- [High] The function `joycon_config_rumble()` sets the `EV_FF` capability unconditionally and ignores the return value of `input_ff_create_memless()`. If memory allocation fails, `dev->ff` remains `NULL`. The device is subsequently successfully registered. When a userspace application issues a force-feedback ioctl (`EVIOCSFF`), `input_ff_upload()` checks `test_bit(EV_FF, dev->evbit)` which passes, and then dereferences the `NULL` `dev->ff` pointer, causing a kernel panic.
- [High] Insufficient length checking on incoming HID reports allows an out-of-bounds read on the input buffer, potentially leaking uninitialized kernel heap data or causing a crash.
- [Medium] The allocated `player_id` IDA slot is leaked if `joycon_leds_create()` fails after successful IDA allocation.
- [Medium] Calling `ida_free()` with `U32_MAX` on a probe failure path causes a kernel warning.
--

--- Patch [1]: [PATCH] HID: nintendo: register input device after capabilities are set ---
commit 346545e7ce7a9520ab6a8be23f83f920de4db331
Author: Jiangshan Yi <yijiangshan@kylinos.cn>

HID: nintendo: register input device after capabilities are set

This commit moves input_register_device() to the end of
joycon_input_create(). This prevents a race condition where EVIOCSFF could
dereference a NULL dev->ff, and ensures the initial udev event has complete
button and axis information.

Link: https://sashiko.dev/#/patchset/20260730031927.25444-1-yijiangshan@kylinos.cn?part=1

> diff --git a/drivers/hid/hid-nintendo.c b/drivers/hid/hid-nintendo.c
> index e7302ec01ff1f..7f014f3718004 100644
> --- a/drivers/hid/hid-nintendo.c
> +++ b/drivers/hid/hid-nintendo.c
> @@ -2162,10 +2162,6 @@ static int joycon_input_create(struct joycon_ctlr *ctlr)
>  	ctlr->input->phys = hdev->phys;
>  	input_set_drvdata(ctlr->input, ctlr);
>  
> -	ret = input_register_device(ctlr->input);
> -	if (ret)
> -		return ret;
> -
>  	if (joycon_type_is_right_joycon(ctlr)) {
>  		joycon_config_right_stick(ctlr->input);

[ ... ]

> @@ -2208,6 +2204,10 @@ static int joycon_input_create(struct joycon_ctlr *ctlr)
>  	if (joycon_has_rumble(ctlr))
>  		joycon_config_rumble(ctlr);

[Severity: High]
This is a pre-existing issue, but does joycon_config_rumble() properly
handle memory allocation failures?

If input_ff_create_memless() fails due to memory pressure, dev->ff remains
NULL. However, the EV_FF capability is still unconditionally set:

joycon_config_rumble() {
        ...
        input_set_capability(ctlr->input, EV_FF, FF_RUMBLE);
        input_ff_create_memless(ctlr->input, NULL, joycon_play_effect);
        ...
}

Could this lead to a kernel panic? If a userspace application subsequently
issues an EVIOCSFF ioctl, input_ff_upload() checks for EV_FF, which passes,
and then it might dereference the NULL dev->ff pointer.

> +	ret = input_register_device(ctlr->input);
> +	if (ret)
> +		return ret;
> +
>  	return 0;
>  }

[Severity: Medium]
This isn't a bug introduced by this patch, but does the driver leak the
player_id IDA slot if joycon_leds_create() fails?

In joycon_probe(), if a later step fails, the error path goes to err_close,
which bypasses the err_ida cleanup label:

joycon_probe() {
        ...
        ret = joycon_leds_create(ctlr);
        if (ret) {
                hid_err(hdev, "Failed to create leds; ret=%d\n", ret);
                goto err_close;
        }
        ...
err_close:
        ...
}

Could this result in permanently leaking the allocated IDA slot since
err_ida is skipped?

[Severity: Medium]
This is a pre-existing issue, but can the driver trigger a kernel warning
by freeing an invalid IDA?

If ida_alloc() fails in joycon_leds_create(), ctlr->player_id is set to
U32_MAX:

joycon_leds_create() {
        ctlr->player_id = U32_MAX;
        ret = ida_alloc(&nintendo_player_id_allocator, GFP_KERNEL);
        if (ret < 0) {
                hid_warn(hdev, "Failed to allocate player ID...\n", ret);
                goto home_led;
        }
        ...
}

If a subsequent initialization step in joycon_probe() fails, the error path
jumps to err_ida:

joycon_probe() {
        ...
err_ida:
        ida_free(&nintendo_player_id_allocator, ctlr->player_id);
}

Does this unconditionally call ida_free() with U32_MAX, triggering a
WARN_ON_ONCE in the IDA subsystem?

[Severity: High]
This isn't a bug introduced by this patch, but is there an out-of-bounds
read vulnerability when parsing incoming HID reports?

In joycon_ctlr_read_handler(), the length check only ensures the payload is
at least 12 bytes:

joycon_ctlr_read_handler() {
        ...
        if (size >= 12)
                joycon_parse_report(ctlr, (struct joycon_input_report *)data);
        ...
}

However, if the report ID is JC_INPUT_IMU_DATA, joycon_parse_report()
delegates to joycon_parse_imu_report():

joycon_parse_report() {
        ...
        if ((rep->id == JC_INPUT_IMU_DATA) && joycon_has_imu(ctlr))
                joycon_parse_imu_report(ctlr, rep);
        ...
}

Since joycon_parse_imu_report() expects a full 49-byte payload and reads
36 bytes of IMU data starting at offset 13, could an attacker send a
truncated 12-byte report to force an out-of-bounds read, potentially leaking
uninitialized kernel heap data to userspace?

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20260730101506.547340-1-yijiangshan@kylinos.cn?part=1

      reply	other threads:[~2026-07-30 10:44 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-07-30 10:15 [PATCH] HID: nintendo: register input device after capabilities are set Jiangshan Yi
2026-07-30 10:44 ` sashiko-bot [this message]

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=20260730104441.F422E1F00AC4@smtp.kernel.org \
    --to=sashiko-bot@kernel.org \
    --cc=dmitry.torokhov@gmail.com \
    --cc=linux-input@vger.kernel.org \
    --cc=sashiko-reviews@lists.linux.dev \
    --cc=yijiangshan@kylinos.cn \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox