Linux PCI subsystem development
 help / color / mirror / Atom feed
From: sashiko-bot@kernel.org
To: "Danilo Krummrich" <dakr@kernel.org>
Cc: linux-pci@vger.kernel.org, ojeda@kernel.org
Subject: Re: [PATCH v3 13/27] rust: usb: make Driver trait lifetime-parameterized
Date: Sun, 17 May 2026 00:25:33 +0000	[thread overview]
Message-ID: <20260517002533.ABB17C19425@smtp.kernel.org> (raw)
In-Reply-To: <20260517000149.3226762-14-dakr@kernel.org>

Thank you for your contribution! Sashiko AI review found 3 potential issue(s) to consider:
- [Critical] Use-After-Free vulnerability due to incorrect `'bound` lifetime on dynamic `DeviceId`.
- [High] Soundness violation and FFI lifetime bypass in driver data retrieval.
- [Low] Commit message incorrectly references `unbind()` instead of `disconnect()`.
--

commit 92ace0018c4af4c9a4ccdae5f9dd912c5a7f6ab0
Author: Danilo Krummrich <dakr@kernel.org>

rust: usb: make Driver trait lifetime-parameterized

This commit introduces a 'bound lifetime parameter to the usb::Driver::Data
associated type. This allows driver private data to store references directly
instead of relying on Devres. The probe and disconnect callbacks are updated
to use this lifetime.

> The probe() and unbind() callbacks thus gain a 'bound lifetime parameter
> on the methods themselves; avoiding a global lifetime on the trait impl.

This isn't a bug, but the commit message references unbind() instead of
disconnect(). The USB subsystem specifically uses disconnect(), whereas
unbind() is typically used by other bus types like platform drivers.

> diff --git a/rust/kernel/usb.rs b/rust/kernel/usb.rs
> index 995221d327b89..ec67e4d2416f1 100644
> --- a/rust/kernel/usb.rs
> +++ b/rust/kernel/usb.rs

[ ... ]

> @@ -110,7 +110,7 @@ extern "C" fn disconnect_callback(intf: *mut bindings::usb_interface) {
>          // SAFETY: `disconnect_callback` is only ever called after a successful call to
>          // `probe_callback`, hence it's guaranteed that `Device::set_drvdata()` has been called
>          // and stored a `Pin<KBox<T::Data>>`.
> -        let data = unsafe { dev.drvdata_borrow::<T::Data>() };
> +        let data = unsafe { dev.drvdata_borrow::<T::Data<'_>>() };
>  
>          T::disconnect(intf, data);
>      }

Does this violate the type matching contract of ForeignOwnable?

The data is originally stored in probe_callback() with a local 'probe lifetime
but is retrieved here with a newly instantiated local '_ lifetime.

If a driver implements Data<'bound> such that it is invariant over 'bound
(for example, by using interior mutability like Cell<&'bound Interface>), then
T::Data<'probe> and T::Data<'_> are formally different types in Rust.

Transmuting between invariant types with different lifetimes could violate the
safety preconditions of ForeignOwnable and bypass the borrow checker's ability
to verify constraints across the FFI boundary.

[ ... ]

> @@ -315,16 +319,19 @@ pub trait Driver {
>      ///
>      /// Called when a new USB interface is bound to this driver.
>      /// Implementers should attempt to initialize the interface here.
> -    fn probe(
> -        interface: &Interface<device::Core>,
> -        id: &DeviceId,
> -        id_info: &Self::IdInfo,
> -    ) -> impl PinInit<Self::Data, Error>;
> +    fn probe<'bound>(
> +        interface: &'bound Interface<device::Core>,
> +        id: &'bound DeviceId,
> +        id_info: &'bound Self::IdInfo,
> +    ) -> impl PinInit<Self::Data<'bound>, Error> + 'bound;

Can tying the id parameter to the 'bound lifetime result in a use-after-free?

When a device is bound using a dynamic ID (added via the new_id sysfs
attribute), the USB core passes a pointer to a dynamically allocated
struct usb_dynid to the probe function via usb_match_dynamic_id().

Userspace can remove dynamic IDs at any time using the remove_id sysfs
attribute, which unlinks and frees the usb_dynid without checking if any
currently bound devices matched against it.

If a Rust driver safely stores the id reference in its private Data<'bound>
based on this lifetime guarantee, it could hold a dangling pointer once the
dynamic ID is removed, potentially causing a use-after-free later during
the device's lifecycle.

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20260517000149.3226762-1-dakr@kernel.org?part=13

  reply	other threads:[~2026-05-17  0:25 UTC|newest]

Thread overview: 98+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-05-17  0:00 [PATCH v3 00/27] rust: device: Higher-Ranked Lifetime Types for device drivers Danilo Krummrich
2026-05-17  0:00 ` [PATCH v3 01/27] rust: alloc: remove `'static` bound on `ForeignOwnable` Danilo Krummrich
2026-05-18 14:42   ` Alexandre Courbot
2026-05-17  0:00 ` [PATCH v3 02/27] rust: driver: move 'static bounds to constructor Danilo Krummrich
2026-05-18 14:42   ` Alexandre Courbot
2026-05-17  0:00 ` [PATCH v3 03/27] rust: driver: decouple driver private data from driver type Danilo Krummrich
2026-05-17  0:19   ` sashiko-bot
2026-05-17 14:32   ` Danilo Krummrich
2026-05-19 12:47     ` Gary Guo
2026-05-18 14:43   ` Alexandre Courbot
2026-05-17  0:00 ` [PATCH v3 04/27] rust: driver core: drop drvdata before devres release Danilo Krummrich
2026-05-17  0:37   ` sashiko-bot
2026-05-18 14:45   ` Alexandre Courbot
2026-05-19 12:47   ` Gary Guo
2026-05-17  0:00 ` [PATCH v3 05/27] rust: pci: implement Sync for Device<Bound> Danilo Krummrich
2026-05-17  0:40   ` sashiko-bot
2026-05-18 14:46   ` Alexandre Courbot
2026-05-19 13:01   ` Gary Guo
2026-05-17  0:00 ` [PATCH v3 06/27] rust: platform: " Danilo Krummrich
2026-05-18 14:46   ` Alexandre Courbot
2026-05-19 13:01   ` Gary Guo
2026-05-17  0:00 ` [PATCH v3 07/27] rust: auxiliary: " Danilo Krummrich
2026-05-17  0:36   ` sashiko-bot
2026-05-18 14:47   ` Alexandre Courbot
2026-05-19 13:02   ` Gary Guo
2026-05-17  0:00 ` [PATCH v3 08/27] rust: usb: " Danilo Krummrich
2026-05-17  0:33   ` sashiko-bot
2026-05-18 14:47   ` Alexandre Courbot
2026-05-19 13:02   ` Gary Guo
2026-05-17  0:00 ` [PATCH v3 09/27] rust: device: " Danilo Krummrich
2026-05-17  0:25   ` sashiko-bot
2026-05-18 14:48   ` Alexandre Courbot
2026-05-19 13:02   ` Gary Guo
2026-05-17  0:00 ` [PATCH v3 10/27] rust: pci: make Driver trait lifetime-parameterized Danilo Krummrich
2026-05-17  0:29   ` sashiko-bot
2026-05-18 14:53   ` Alexandre Courbot
2026-05-18 15:36   ` Gary Guo
2026-05-18 16:10     ` Danilo Krummrich
2026-05-19  4:52   ` Eliot Courtney
2026-05-19 10:39     ` Danilo Krummrich
2026-05-19 11:48       ` Gary Guo
2026-05-19 12:36         ` Danilo Krummrich
2026-05-20  6:14           ` Eliot Courtney
2026-05-17  0:00 ` [PATCH v3 11/27] rust: platform: " Danilo Krummrich
2026-05-18 14:55   ` Alexandre Courbot
2026-05-17  0:01 ` [PATCH v3 12/27] rust: auxiliary: " Danilo Krummrich
2026-05-18 15:39   ` Alexandre Courbot
2026-05-17  0:01 ` [PATCH v3 13/27] rust: usb: " Danilo Krummrich
2026-05-17  0:25   ` sashiko-bot [this message]
2026-05-18 15:40   ` Alexandre Courbot
2026-05-17  0:01 ` [PATCH v3 14/27] rust: i2c: " Danilo Krummrich
2026-05-17  0:39   ` sashiko-bot
2026-05-18 15:41   ` Alexandre Courbot
2026-05-17  0:01 ` [PATCH v3 15/27] rust: driver: update module documentation for GAT-based Data type Danilo Krummrich
2026-05-18 15:46   ` Alexandre Courbot
2026-05-17  0:01 ` [PATCH v3 16/27] rust: types: add `ForLt` trait for higher-ranked lifetime support Danilo Krummrich
2026-05-17  0:23   ` sashiko-bot
2026-05-19  6:02   ` Eliot Courtney
2026-05-19 11:23     ` Gary Guo
2026-05-19 11:07   ` Alexandre Courbot
2026-05-19 11:39     ` Gary Guo
2026-05-19 13:03       ` Danilo Krummrich
2026-05-19 13:34         ` Miguel Ojeda
2026-05-17  0:01 ` [PATCH v3 17/27] rust: auxiliary: generalize Registration over ForLt Danilo Krummrich
2026-05-17  0:31   ` sashiko-bot
2026-05-19  7:56   ` Eliot Courtney
2026-05-19 10:39     ` Danilo Krummrich
2026-05-19 11:20       ` Gary Guo
2026-05-19 16:45   ` Gary Guo
2026-05-20  0:33     ` Danilo Krummrich
2026-05-20  9:34       ` Gary Guo
2026-05-17  0:01 ` [PATCH v3 18/27] samples: rust: rust_driver_auxiliary: showcase lifetime-bound registration data Danilo Krummrich
2026-05-19  6:52   ` Eliot Courtney
2026-05-19 15:48   ` Gary Guo
2026-05-17  0:01 ` [PATCH v3 19/27] rust: pci: make Bar lifetime-parameterized Danilo Krummrich
2026-05-17  0:57   ` sashiko-bot
2026-05-19  6:36   ` Eliot Courtney
2026-05-19 16:24   ` Gary Guo
2026-05-19 17:27     ` Danilo Krummrich
2026-05-17  0:01 ` [PATCH v3 20/27] rust: io: make IoMem and ExclusiveIoMem lifetime-parameterized Danilo Krummrich
2026-05-17  1:31   ` sashiko-bot
2026-05-19  6:39   ` Eliot Courtney
2026-05-17  0:01 ` [PATCH v3 21/27] samples: rust: rust_driver_pci: use HRT lifetime for Bar Danilo Krummrich
2026-05-17  0:57   ` sashiko-bot
2026-05-19  6:41   ` Eliot Courtney
2026-05-17  0:01 ` [PATCH v3 22/27] rust: driver-core: rename 'a lifetime to 'bound Danilo Krummrich
2026-05-17  0:31   ` sashiko-bot
2026-05-19  6:42   ` Eliot Courtney
2026-05-19 16:56   ` Gary Guo
2026-05-19 17:23     ` Danilo Krummrich
2026-05-17  0:01 ` [PATCH REF v3 23/27] gpu: nova-core: " Danilo Krummrich
2026-05-17  0:01 ` [PATCH REF v3 24/27] gpu: nova-core: use lifetime for Bar Danilo Krummrich
2026-05-17  0:58   ` sashiko-bot
2026-05-17  0:01 ` [PATCH REF v3 25/27] gpu: nova-core: unregister sysmem flush page from Drop Danilo Krummrich
2026-05-17  0:50   ` sashiko-bot
2026-05-17  0:01 ` [PATCH REF v3 26/27] gpu: nova-core: replace ARef<Device> with &'bound Device in SysmemFlush Danilo Krummrich
2026-05-17  0:01 ` [PATCH REF v3 27/27] gpu: drm: tyr: use lifetime for IoMem Danilo Krummrich
2026-05-17  0:47   ` 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=20260517002533.ABB17C19425@smtp.kernel.org \
    --to=sashiko-bot@kernel.org \
    --cc=dakr@kernel.org \
    --cc=linux-pci@vger.kernel.org \
    --cc=ojeda@kernel.org \
    --cc=sashiko-reviews@lists.linux.dev \
    /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