Re: [PATCH 04/17] mpi3mr: Fix target device reference leak in BSG task management

Chandrakanth Patil <[email protected]>
Newsgroups org.kernel.vger.linux-scsi,dev.linux.lists.sashiko-reviews
Message-ID <CABvwm=NaWiC5=_+kFwTE+mQ5N70p86uxAWerGvL11gXGvZgLrg@mail.gmail.com>
On Tue, Aug 18, 2026 at 11:43 PM <[email protected]> wrote:
>
> Thank you for your contribution! Sashiko AI review found 4 potential issue(s) to consider:
>
> Pre-existing issues:
> - [High] Use-after-free of SCSI target private data (`stgt_priv`) during completion of BSG task management commands if the device is hot-removed.
> - [High] Unprotected lockless access to `tgtdev->starget` can lead to a NULL pointer dereference or Use-After-Free.
> - [High] Missing bounds validation on the BSG `request_len` allows an Out-of-Bounds read when accessing the variable-length buffer entry list.
> - [High] Little-endian `__le16` fields from the user request are assigned to CPU-endian `u16` variables without `le16_to_cpu()` conversion.
> --
>
> --- Patch [4]: [PATCH 04/17] mpi3mr: Fix target device reference leak in BSG task management ---
> (Note: The format of this review has been altered to a free-form summary due
> to automated recitation restrictions. The original patch diff is not quoted.)
>
> commit c103d1267a7a6a9328e7aab3dbe852bbbb68d3e6
> Author: Chandrakanth Patil <[email protected]>
>
> mpi3mr: Fix target device reference leak in BSG task management
>
> This commit fixes a reference leak for the target device during BSG task
> management command processing. The reference is now dropped whenever the
> lookup succeeds, regardless of whether the SCSI target data is fully setup.
>
> [Severity: High]
> This isn't a bug introduced by this patch, but there appears to be a use
> after free risk regarding the SCSI target private data. In
> mpi3mr_bsg_process_mpt_cmds(), the block_io counter is incremented on
> stgt_priv, and then the target device reference is dropped before sleeping
> via wait_for_completion_timeout(). If the target is hot-removed during this
> sleep, mpi3mr_target_destroy() will free starget->hostdata. Upon waking,
> does the atomic_dec() on stgt_priv->block_io write to freed memory?
>
> [Severity: High]
> This is a pre-existing issue, but the access to the target device's starget
> pointer seems unprotected. In mpi3mr_bsg_process_mpt_cmds(), tgtdev->starget
> is checked for NULL and then dereferenced locklessly to access hostdata.
> Since mpi3mr_target_destroy() can concurrently set tgtdev->starget to NULL
> under the tgtdev_lock, could this result in a NULL pointer dereference if
> the compiler emits multiple loads and the pointer becomes NULL between the
> check and the dereference?
>
> [Severity: High]
> This isn't a bug introduced by this patch, but there might be an out of
> bounds read when iterating over the BSG buffer entries. In
> mpi3mr_bsg_process_mpt_cmds(), the loop reads buf_type and buf_len from the
> buf_entries list. Is there any validation that the number of entries
> provided by the user does not exceed the bounds of the allocated
> job->request_len? Could a small request length with a large entry count read
> arbitrary slab memory?
>
> [Severity: High]
> This is a pre-existing issue, but is there a missing endianness conversion
> when parsing the device handle? In mpi3mr_bsg_process_mpt_cmds(),
> tm_req->dev_handle is an __le16 field, but it is assigned directly to a u16
> local variable without le16_to_cpu(). Similarly,
> mpi_header->function_dependent is passed directly to mpi3mr_issue_tm(). On
> big-endian architectures, will this block IO on the wrong device and fail
> to block IO on the actual target of the task management command?
>
> --
> Sashiko AI review · https://sashiko.dev/#/patchset/[email protected]?part=4

Thanks for the review.

New issues:
- None. This patch specifically fixes a target device reference leak
in BSG task management by ensuring mpi3mr_tgtdev_put() is called
whenever tgtdev lookup succeeds.

Pre-existing issues:
- The reported issues (stgt_priv UAF, lockless starget access,
request_len bounds check, and dev_handle endianness conversion) are
pre-existing in the driver and will
  be addressed in a separate follow-up series.
smime.p7s (application/pkcs7-signature, 5.4 KB) - not displayed
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.