From: sashiko-bot@kernel.org
To: "Vicki Pfau" <vi@endrift.com>
Cc: linux-input@vger.kernel.org, dmitry.torokhov@gmail.com
Subject: Re: [PATCH v5 07/12] Input: xbox_gip - Add security implementation from xone
Date: Wed, 02 Sep 2026 01:20:07 +0000 [thread overview]
Message-ID: <20260902012008.1F5951F000E9@smtp.kernel.org> (raw)
In-Reply-To: <20260902010237.865772-8-vi@endrift.com>
Thank you for your contribution! Sashiko AI review found 4 potential issue(s) to consider:
New issues:
- [High] Stack-allocated buffers are used for cryptographic scatterlists, violating DMA constraints and causing kernel panics on architectures with virtually mapped stacks.
- [High] An ABBA deadlock occurs between `attachment->lock` and `cancel_work_sync()` during device teardown or reset.
- [Medium] The driver utilizes CRYPTO_LIB_SHA256 and CRYPTO_RSA but lacks the required Kconfig declarations, which can lead to build and runtime failures.
Pre-existing issues:
- [High] This problem wasn't introduced by this patch, but incorrect teardown order in `gip_disconnect()` allows the URB completion handler to re-queue a work item after it was cancelled, leading to a Use-After-Free.
--
commit 0028f224002448741826a03077075da976d732d6
Author: Vicki Pfau <vi@endrift.com>
Subject: Input: xbox_gip - Add security implementation from xone
This patch imports and adapts the security message implementation from the
out-of-tree xone driver. This message is necessary for most controllers that
use wireless dongles. The implementation hooks into the xbox_gip driver to
handle security commands.
> diff --git a/drivers/input/joystick/gip/Kconfig b/drivers/input/joystick/gip/Kconfig
> index 3422bf84cb895..b933583d325f7 100644
> --- a/drivers/input/joystick/gip/Kconfig
> +++ b/drivers/input/joystick/gip/Kconfig
> @@ -4,7 +4,7 @@
> #
> config JOYSTICK_XBOX_GIP
> tristate "Xbox One/Series controller support"
> - depends on USB && USB_ARCH_HAS_HCD && LEDS_CLASS_MULTICOLOR
> + depends on USB && USB_ARCH_HAS_HCD && LEDS_CLASS_MULTICOLOR && CRYPTO_ECDH
[Severity: Medium]
This patch introduces a dependency on CRYPTO_LIB_SHA256 and CRYPTO_RSA (used
in gip-security.c), but these are missing from the Kconfig depends block.
Can this lead to build and runtime failures when compiling without these
crypto options, or when a device requiring the security handshake connects?
> help
> Say Y here if you want to use Xbox One and Series controllers with your
> computer. Make sure to say Y to "Joystick support" (CONFIG_INPUT_JOYDEV)
[ ... ]
> diff --git a/drivers/input/joystick/gip/gip-core.c b/drivers/input/joystick/gip/gip-core.c
> index 544becf8badd6..db4d2956e7d9b 100644
> --- a/drivers/input/joystick/gip/gip-core.c
> +++ b/drivers/input/joystick/gip/gip-core.c
[ ... ]
> @@ -1809,6 +1797,8 @@ static void gip_free_devices(struct gip_attachment *attachment)
> struct input_dev *input;
> struct hid_device *hdev;
>
> + gip_security_release(&attachment->security);
> +
[Severity: High]
This is a pre-existing issue, but the teardown order in the pre-existing
gip_disconnect() function appears to cancel work items before stopping the
USB URB.
gip_disconnect() calls gip_shutdown() (which eventually calls
gip_security_release() here), and only afterwards calls usb_kill_urb(). If
the incoming URB completes in this window, it can process messages and
re-queue the cancelled work items (e.g., work_exchange_rsa).
After the device is freed by devres, can the re-queued work item execute and
dereference freed pointers, leading to a Use-After-Free?
> if (attachment->driver && attachment->driver->remove)
> attachment->driver->remove(attachment);
[ ... ]
> diff --git a/drivers/input/joystick/gip/gip-security.c b/drivers/input/joystick/gip/gip-security.c
> new file mode 100644
> index 0000000000000..58de547aa1dd1
> --- /dev/null
> +++ b/drivers/input/joystick/gip/gip-security.c
[ ... ]
> +static int gip_security_ecdh_get_secret(struct crypto_kpp *tfm, u8 *pubkey,
> + int pubkey_len, u8 *secret, int secret_len)
> +{
> + struct kpp_request *req;
> + struct scatterlist src, dest;
> + DECLARE_CRYPTO_WAIT(wait);
> + int err;
> +
> + req = kpp_request_alloc(tfm, GFP_KERNEL);
> + if (!req)
> + return -ENOMEM;
> +
> + sg_init_one(&src, pubkey, pubkey_len);
> + sg_init_one(&dest, secret, secret_len);
[Severity: High]
Does this code use a stack-allocated buffer (secret) for a cryptographic
scatterlist? Passing stack memory to sg_init_one() violates DMA constraints
and can cause a kernel panic/Oops (due to BUG_ON(!virt_addr_valid(buf))) on
architectures with virtually mapped stacks.
> + kpp_request_set_input(req, &src, pubkey_len);
> + kpp_request_set_output(req, &dest, secret_len);
[ ... ]
> +static int gip_security_compute_ecdh(u8 *pubkey_in, u8 *pubkey_out, int pubkey_len, u8 *secret_hash)
> +{
> + struct crypto_kpp *tfm_ecdh;
> + u8 secret[GIP_SECURITY_ECDH_SECRET_LEN] = {0};
> + int err;
> +
> + tfm_ecdh = crypto_alloc_kpp("ecdh-nist-p256", 0, 0);
> + if (IS_ERR(tfm_ecdh)) {
> + err = PTR_ERR(tfm_ecdh);
> + goto err_free_secret;
> + }
> +
> + err = gip_security_ecdh_get_pubkey(tfm_ecdh, pubkey_out, pubkey_len);
> + if (err)
> + goto err_free_ecdh;
> +
> + err = gip_security_ecdh_get_secret(tfm_ecdh, pubkey_in, pubkey_len,
> + secret, sizeof(secret));
[ ... ]
> +static void gip_security_exchange_rsa(struct work_struct *work)
> +{
> + struct gip_security *security = container_of(work, typeof(*security), work_exchange_rsa);
> + struct gip_attachment *attachment = container_of(security, struct gip_attachment, security);
> + struct gip_security_host_secret message = {};
> + u8 random[GIP_SECURITY_RANDOM_LEN * 2];
> + int err;
> +
> + guard(mutex)(&attachment->lock);
[ ... ]
> +void gip_security_release(struct gip_security *security)
> +{
> + if (security->status < GIP_SECURITY_SENT)
> + return;
> +
> + cancel_work_sync(&security->work_exchange_rsa);
[Severity: High]
Can this cause an ABBA deadlock during device teardown?
During hot-unplug, gip_shutdown() in gip-core.c acquires attachment->lock
and then calls gip_security_release(), which synchronously waits for the
work item using cancel_work_sync().
Simultaneously, the running gip_security_exchange_rsa() work item blocks
trying to acquire the same attachment->lock mutex.
> + cancel_work_sync(&security->work_exchange_ecdh);
> + cancel_work_sync(&security->work_complete);
> +
> + memzero_explicit(&security->transcript, sizeof(security->transcript));
> +
> + security->status = GIP_SECURITY_PENDING;
> +}
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260902010237.865772-1-vi@endrift.com?part=7
next prev parent reply other threads:[~2026-09-02 1:20 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-02 1:02 [PATCH v5 00/12] Input: xbox_gip - Add new driver for Xbox GIP Vicki Pfau
2026-09-02 1:02 ` [PATCH v5 01/12] " Vicki Pfau
2026-09-02 1:28 ` sashiko-bot
2026-09-02 1:02 ` [PATCH v5 02/12] Input: xpad - Remove Xbox One support Vicki Pfau
2026-09-02 1:02 ` [PATCH v5 03/12] Input: xbox_gip - Add controllable LED support Vicki Pfau
2026-09-02 1:20 ` sashiko-bot
2026-09-02 1:02 ` [PATCH v5 04/12] Input: xbox_gip - Add HID relaying Vicki Pfau
2026-09-02 1:22 ` sashiko-bot
2026-09-02 1:02 ` [PATCH v5 05/12] Input: xbox_gip - Add battery support Vicki Pfau
2026-09-02 1:20 ` sashiko-bot
2026-09-02 1:02 ` [PATCH v5 06/12] Input: xbox_gip - Allow sending fragmented and ACME messages Vicki Pfau
2026-09-02 1:19 ` sashiko-bot
2026-09-02 1:02 ` [PATCH v5 07/12] Input: xbox_gip - Add security implementation from xone Vicki Pfau
2026-09-02 1:20 ` sashiko-bot [this message]
2026-09-02 1:02 ` [PATCH v5 08/12] Input: xbox_gip - Add arcade stick support Vicki Pfau
2026-09-02 1:24 ` sashiko-bot
2026-09-02 1:02 ` [PATCH v5 09/12] Input: xbox_gip - Add support for PDP guitar controllers Vicki Pfau
2026-09-02 1:02 ` [PATCH v5 10/12] Input: Add ABS_CLUTCH, HANDBRAKE, and SHIFTER Vicki Pfau
2026-09-02 1:23 ` sashiko-bot
2026-09-02 1:02 ` [PATCH v5 11/12] HID: Map more automobile simulation inputs Vicki Pfau
2026-09-02 1:02 ` [PATCH v5 12/12] Input: xbox_gip - Add wheel support Vicki Pfau
2026-09-02 1:33 ` sashiko-bot
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=20260902012008.1F5951F000E9@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=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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox