Re: [PATCH v5 12/27] scsi-multipath: introduce scsi_device head structure

John Garry <[email protected]>
Newsgroups org.kernel.vger.linux-scsi,dev.linux.lists.sashiko-reviews
Organization Oracle Corporation
Message-ID <[email protected]>
On 27/07/2026 16:15, [email protected] wrote:
> Thank you for your contribution! Sashiko AI review found 3 potential issue(s) to consider:
> - [High] The `smpdt` (mpath_head_template) is defined without implementing logically required callbacks, which will lead to a NULL pointer dereference.
> - [High] scsi_mpath_unique_lun_id treats a 0-length Unique LUN ID as success, leading to unintended grouping of devices with empty IDs.
> - [Low] The function `scsi_multipath_sysfs_group_visible` and the macro invocation `DEFINE_SIMPLE_SYSFS_GROUP_VISIBLE(scsi_multipath_sysfs)` are defined but never used.
> --
> 
> --- Patch [12]: [PATCH v5 12/27] scsi-multipath: introduce scsi_device head structure ---
> commit 0296ab446bccfc5a00926fcca72b8b18f69d4e30
> Author: John Garry <[email protected]>
> Subject: scsi-multipath: introduce scsi_device head structure
> 
> Introduce a scsi_device head structure - scsi_mpath_head - to manage
> multipathing for a scsi_device. This is similar to nvme_ns_head structure.
> A list of scsi_mpath_head structures is managed to lookup for matching
> multipathed scsi_device's.
> 
>> diff --git a/drivers/scsi/scsi_multipath.c b/drivers/scsi/scsi_multipath.c
>> index 947f3e2103e6b..5d19ab6a89eb5 100644
>> --- a/drivers/scsi/scsi_multipath.c
>> +++ b/drivers/scsi/scsi_multipath.c
>> @@ -70,6 +74,55 @@ static int scsi_mpath_unique_lun_id(struct scsi_device *sdev)
> 
> [Severity: High]
> Does this function mistakenly treat a 0-length Unique LUN ID as success?
> 
> Looking at scsi_mpath_unique_lun_id() in drivers/scsi/scsi_multipath.c:
> 
> 	ret = scsi_vpd_lun_id(sdev, scsi_mpath_dev->device_id_str,
> 				SCSI_MPATH_DEVICE_ID_LEN);
> 	if (ret < 0)
> 		return ret;
> 
> If a SCSI device responds with a valid VPD page 0x83 but a 0-length SCSI name
> string, scsi_vpd_lun_id() returns 0. Since this code only checks if (ret < 0),
> it will accept 0 as success.

hmmm ... in checking scsi_vpd_lun_id(), I don't see how the length could 
ever be zero

> 
> This could cause the multipath subsystem to incorrectly group distinct devices
> with empty IDs together, as strncmp("", "", 256) will match, routing I/O
> intended for one disk to another entirely separate disk.
> 
>>   	return 0;
>>   }
>>   
>> +static void scsi_mpath_head_release(struct device *dev)
> [ ... ]
>> +static bool scsi_multipath_sysfs_group_visible(struct kobject *kobj)
>> +{
>> +	return true;
>> +}
>> +DEFINE_SIMPLE_SYSFS_GROUP_VISIBLE(scsi_multipath_sysfs)
> 
> [Severity: Low]
> Are this function and macro invocation needed?
> 
> They appear to be defined but never used to gate an attribute group in this
> patch.

used later

> 
>> +
>> +static const struct attribute_group *scsi_mpath_device_groups[] = {
> [ ... ]
>> @@ -89,6 +142,74 @@ static int scsi_multipath_sdev_init(struct scsi_device *sdev)
>>   	return 0;
>>   }
>>   
>> +static struct mpath_head_template smpdt = {
>> +};
> 
> [Severity: High]
> Can this empty template cause a NULL pointer dereference?
> 
> Because smpdt is defined as an empty struct, all its function pointers are
> NULL. The multipath core unconditionally invokes template callbacks (such as
> is_disabled and is_optimized) without checking for NULL.
> 
> When a multipath SCSI device is configured and processed, invoking these
> callbacks could trigger a kernel panic.

they are added later

> 
>> +
>> +static struct scsi_mpath_head *scsi_mpath_alloc_head(char *vpd_id)
>> +{
>> +	struct scsi_mpath_head *scsi_mpath_head;
> [ ... ]
>> +	if (mpath_head_init(&scsi_mpath_head->mpath_head))
>> +		goto out_free;
>> +	scsi_mpath_head->mpath_head.mpdt = &smpdt;
>
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.