Linux SCSI subsystem development
 help / color / mirror / Atom feed
From: sashiko-bot@kernel.org
To: "Shivasharan S" <shivasharan.srikanteshwara@broadcom.com>,
	linux-scsi@vger.kernel.org
Subject: Re: [PATCH 09/37] scsi: mpt3sas: Clamp topology/IR event entry counts to EventDataLength
Date: Fri, 06 Nov 2026 01:13:05 +0000	[thread overview]
Message-ID: <sashiko-outbox-200489@kernel.org> (raw)
In-Reply-To: <1793925772-1303-10-git-send-email-shivasharan.srikanteshwara@broadcom.com>

Thank you for your contribution! Sashiko AI review found 2 potential issue(s) to consider:
- [High] scsi: mpt3sas: u16 sz truncation bypasses u32 data_len clamp in mpt3sas_scsih_event_callback()
- [High] scsi: mpt3sas: out-of-bounds access when EventDataLength is smaller than hdr_size
--

commit 6f4d73dbcac7a66faf3928944f8f083832f7bc3b
Author: Shivasharan S <shivasharan.srikanteshwara@broadcom.com>

scsi: mpt3sas: Clamp topology/IR event entry counts to EventDataLength

This commit clamps NumEntries and NumElements in SAS topology, PCIe topology,
and IR configuration change events to the maximum number of entries that fit
within EventDataLength.

> diff --git a/drivers/scsi/mpt3sas/mpt3sas_scsih.c b/drivers/scsi/mpt3sas/mpt3sas_scsih.c
> index a697200844078..4730e2d344f00 100644
> --- a/drivers/scsi/mpt3sas/mpt3sas_scsih.c
> +++ b/drivers/scsi/mpt3sas/mpt3sas_scsih.c
> @@ -12212,9 +12212,21 @@ mpt3sas_scsih_event_callback(struct MPT3SAS_ADAPTER *ioc, u8 msix_index,
>  	}
>  
>  	case MPI2_EVENT_SAS_TOPOLOGY_CHANGE_LIST:
> -		_scsih_check_topo_delete_events(ioc,
> +	{
> +		Mpi2EventDataSasTopologyChangeList_t *topo_data =
>  		    (Mpi2EventDataSasTopologyChangeList_t *)
> -		    mpi_reply->EventData);
> +		    mpi_reply->EventData;
> +		u32 data_len = le16_to_cpu(mpi_reply->EventDataLength) * 4;

[Severity: High]
Can a 16-bit truncation of sz later in mpt3sas_scsih_event_callback() bypass
this u32 data_len clamp and still overflow fw_event->event_data[]?

Here and in the MPI2_EVENT_PCIE_TOPOLOGY_CHANGE_LIST and
MPI2_EVENT_IR_CONFIGURATION_CHANGE_LIST cases, data_len is computed as a u32,
whereas sz used for allocating and populating fw_event->event_data is declared
as a u16 in mpt3sas_scsih_event_callback():

	u16 event;
	u16 sz;
	...
	sz = le16_to_cpu(mpi_reply->EventDataLength) * 4;
	fw_event = alloc_fw_event_work(sz);
	...
	memcpy(fw_event->event_data, mpi_reply->EventData, sz);

If EventDataLength is >= 0x4000 (for example, 0x4003), data_len is 65548, so
max_entries is 8192 and an 8-bit NumEntries or NumElements value (up to 255)
is not clamped. However, sz truncates modulo 65536 to 12 bytes, so
alloc_fw_event_work(sz) allocates only 12 bytes for fw_event->event_data and
copies the header containing the unclamped NumEntries or NumElements. When
_mpt3sas_fw_work() later runs _scsih_sas_topology_change_event(),
_scsih_pcie_topology_change_event(), or _scsih_sas_ir_config_change_event(),
won't the loops over PHY[], PortEntry[], or ConfigElement[] read and write
past the end of fw_event->event_data?

> +		size_t hdr_size =
> +		    offsetof(Mpi2EventDataSasTopologyChangeList_t, PHY);
> +		u16 max_entries = 0;
> +
> +		if (data_len > hdr_size)
> +			max_entries = (data_len - hdr_size) /
> +			    sizeof(Mpi2EventSasTopoPhyEntry_t);
> +		if (topo_data->NumEntries > max_entries)
> +			topo_data->NumEntries = max_entries;
> +		_scsih_check_topo_delete_events(ioc, topo_data);

[Severity: High]
What happens if EventDataLength is smaller than hdr_size (for example,
EventDataLength is 0 or 1, so data_len < 12 for SAS/PCIe topology events or
data_len < 8 for IR configuration change events)?

When data_len < hdr_size, max_entries (or max_elements) is 0, but the event is
not rejected before calling _scsih_check_topo_delete_events(),
_scsih_check_pcie_topo_remove_events(), or
_scsih_check_ir_config_unhide_events(), and execution continues to allocate
and queue fw_event with sz = data_len:

	sz = le16_to_cpu(mpi_reply->EventDataLength) * 4;
	fw_event = alloc_fw_event_work(sz);
	...
	memcpy(fw_event->event_data, mpi_reply->EventData, sz);

Because memcpy() only copies sz bytes into fw_event->event_data, fixed header
fields such as ExpStatus/SwitchStatus (at offset 10), NumEntries (at offset 8),
or Flags (at offset 4) lie beyond the copied payload and, when sz is 0 or 4,
beyond the end of the fw_event slab allocation. When
_scsih_sas_topology_change_event(), _scsih_pcie_topology_change_event(), or
_scsih_sas_ir_config_change_event() (as well as the fw_event_list walks in
_scsih_check_topo_delete_events() and _scsih_check_pcie_topo_remove_events())
access those header fields in fw_event->event_data, can this read out of
bounds past fw_event->event_data?

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/1793925772-1303-1-git-send-email-shivasharan.srikanteshwara@broadcom.com?part=9

  reply	other threads:[~2026-11-06  1:13 UTC|newest]

Thread overview: 55+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-11-06  0:42 [PATCH 00/37] scsi: mpt3sas: Validate firmware/user input and fix error-path bugs Shivasharan S
2026-11-06  0:42 ` [PATCH 01/37] scsi: mpt3sas: Validate firmware-reported IOCRequestFrameSize Shivasharan S
2026-11-06  1:17   ` sashiko-bot
2026-11-06  0:42 ` [PATCH 02/37] scsi: mpt3sas: Validate RAID configuration page length Shivasharan S
2026-11-06  1:15   ` sashiko-bot
2026-11-06  0:42 ` [PATCH 03/37] scsi: mpt3sas: Pin Scsi_Host while an ioctl is using its ioc Shivasharan S
2026-11-06  1:19   ` sashiko-bot
2026-11-06  0:42 ` [PATCH 04/37] scsi: mpt3sas: Fix locking and bounds checks on host_trace_buffer sysfs files Shivasharan S
2026-11-06  1:25   ` sashiko-bot
2026-11-06  0:42 ` [PATCH 05/37] scsi: mpt3sas: Fix unlocked use of raid_device in enable_sdev_max_qd_store Shivasharan S
2026-11-06  0:42 ` [PATCH 06/37] scsi: mpt3sas: Fix invalid kfree() of fw_event_work event_data Shivasharan S
2026-11-06  0:42 ` [PATCH 07/37] scsi: mpt3sas: Validate SMP request/response length in bsg handler Shivasharan S
2026-11-06  1:17   ` sashiko-bot
2026-11-06  0:42 ` [PATCH 08/37] scsi: mpt3sas: Validate firmware/user supplied device handles against MaxDevHandle Shivasharan S
2026-11-06  1:15   ` sashiko-bot
2026-11-06  0:42 ` [PATCH 09/37] scsi: mpt3sas: Clamp topology/IR event entry counts to EventDataLength Shivasharan S
2026-11-06  1:13   ` sashiko-bot [this message]
2026-11-06  0:42 ` [PATCH 10/37] scsi: mpt3sas: NULL ioc->reply_post after freeing it Shivasharan S
2026-11-06  0:42 ` [PATCH 11/37] scsi: mpt3sas: Fix port_table memory leak in _scsih_sas_port_refresh Shivasharan S
2026-11-06  0:42 ` [PATCH 12/37] scsi: mpt3sas: Fix leak and dangling pointer for io_uring_poll_queues Shivasharan S
2026-11-06  0:42 ` [PATCH 13/37] scsi: mpt3sas: Validate max_data_size in MPT3EVENTREPORT ioctl Shivasharan S
2026-11-06  0:42 ` [PATCH 14/37] scsi: mpt3sas: Fix buffer overflow in _scsih_scsi_ioc_info Shivasharan S
2026-11-06 11:16   ` kernel test robot
2026-11-06 11:30   ` kernel test robot
2026-11-06  0:42 ` [PATCH 15/37] scsi: mpt3sas: Fix Scsi_Host leak on invalid/tampered device probe Shivasharan S
2026-11-06  0:42 ` [PATCH 16/37] scsi: mpt3sas: Fix page fault from stale ioc->chip after PCI error recovery Shivasharan S
2026-11-06  1:22   ` sashiko-bot
2026-11-06  0:42 ` [PATCH 17/37] scsi: mpt3sas: Clamp ValidEntries in driver trigger page update helpers Shivasharan S
2026-11-06  1:09   ` sashiko-bot
2026-11-06  0:42 ` [PATCH 18/37] scsi: mpt3sas: Clamp firmware reply copies to the allocated reply buffer Shivasharan S
2026-11-06  0:42 ` [PATCH 19/37] scsi: mpt3sas: Reject implausibly small MaxReplyDescriptorPostQueueDepth Shivasharan S
2026-11-06  1:17   ` sashiko-bot
2026-11-06  0:42 ` [PATCH 20/37] scsi: mpt3sas: Validate CurrentHostPageSize before using it as a shift amount Shivasharan S
2026-11-06  1:12   ` sashiko-bot
2026-11-06  0:42 ` [PATCH 21/37] scsi: mpt3sas: Clamp sense_length before copying into transfer_packet->sense Shivasharan S
2026-11-06  0:42 ` [PATCH 22/37] scsi: mpt3sas: Clamp num_luns in _scsih_wait_for_target_to_become_ready Shivasharan S
2026-11-06  0:42 ` [PATCH 23/37] scsi: mpt3sas: Validate phy_number in mpt3sas_transport_update_links Shivasharan S
2026-11-06  1:11   ` sashiko-bot
2026-11-06  0:42 ` [PATCH 24/37] scsi: mpt3sas: Require CAP_SYS_RAWIO for mpt2ctl/mpt3ctl ioctls Shivasharan S
2026-11-06  0:42 ` [PATCH 25/37] scsi: mpt3sas: Fix SGE offset boundary check in _ctl_do_mpt_command Shivasharan S
2026-11-06  0:42 ` [PATCH 26/37] scsi: mpt3sas: Enforce minimum reply frame size and validate chain segment size Shivasharan S
2026-11-06  1:24   ` sashiko-bot
2026-11-06  0:42 ` [PATCH 27/37] scsi: mpt3sas: Replace panic() with error return in hard_reset_handler Shivasharan S
2026-11-06  0:42 ` [PATCH 28/37] scsi: mpt3sas: Replace panic() calls with error returns in _config_request Shivasharan S
2026-11-06  1:18   ` sashiko-bot
2026-11-06  0:42 ` [PATCH 29/37] scsi: mpt3sas: Bound event-log copy size against reply frame size Shivasharan S
2026-11-06  0:42 ` [PATCH 30/37] scsi: mpt3sas: Add _ctl_diag_buffer_reset() helper to clear diag buffer state Shivasharan S
2026-11-06  0:42 ` [PATCH 31/37] scsi: mpt3sas: Restrict ioc_dump debugfs and replace raw ioc dump with text Shivasharan S
2026-11-06  0:42 ` [PATCH 32/37] scsi: mpt3sas: Fix out-of-bounds bit operation in _scsih_check_topo_delete_events Shivasharan S
2026-11-06  0:42 ` [PATCH 33/37] scsi: mpt3sas: Bound SMP passthrough buffer reads to actual buffer size Shivasharan S
2026-11-06  0:42 ` [PATCH 34/37] scsi: mpt3sas: Release sas_device reference on error in mpt3sas_transport_port_add Shivasharan S
2026-11-06  0:42 ` [PATCH 35/37] scsi: mpt3sas: NULL the event_log pointer after freeing it Shivasharan S
2026-11-06  0:42 ` [PATCH 36/37] scsi: mpt3sas: Bound NVMe passthrough transfer size against PRP buffer capacity Shivasharan S
2026-11-06  0:42 ` [PATCH 37/37] scsi: mpt3sas: Update driver version to 59.100.00.00 Shivasharan S
2026-11-06  1:37   ` 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=sashiko-outbox-200489@kernel.org \
    --to=sashiko-bot@kernel.org \
    --cc=linux-scsi@vger.kernel.org \
    --cc=sashiko-reviews@lists.linux.dev \
    --cc=shivasharan.srikanteshwara@broadcom.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