On Fri, 16 Mar 2018, Joe Moriarty wrote:
> The Parfait (version 2.1.0) static code analysis tool found the
> following NULL pointer dereference problem.
>
> dev_to_shost() in include/scsi/scsi_host.h has the ability to return
> NULL if the scsi host device does not have the Scsi_host->parent
> field set. With the possibilty of a NULL pointer being set for
> the Scsi_Host->parent field, calls to host_to_us() have to make
> sure the return pointer is not null. Changes were made to check
> for a return value of NULL on calls to host_to_us().
>
> Signed-off-by: Joe Moriarty <[email protected]>
> Reviewed-by: Steven Sistare <[email protected]>
> Acked-by: Hakon Bugge <[email protected]>
> ---
> drivers/usb/storage/scsiglue.c | 13 ++++++++++++-
> 1 file changed, 12 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/usb/storage/scsiglue.c b/drivers/usb/storage/scsiglue.c
> index c267f2812a04..00a8cb005e83 100644
> --- a/drivers/usb/storage/scsiglue.c
> +++ b/drivers/usb/storage/scsiglue.c
> @@ -329,7 +329,18 @@ static int slave_configure(struct scsi_device *sdev)
>
> static int target_alloc(struct scsi_target *starget)
> {
> - struct us_data *us = host_to_us(dev_to_shost(starget->dev.parent));
> + struct Scsi_Host *host;
> + struct us_data *us;
> +
> + host = dev_to_shost(starget->dev.parent);
> + if (!host) {
> + dev_dbg(&(starget)->dev,
> + "SCSI Host not found, Error in %s: us = NULL\n",
> + __func__);
> + return -ENODEV;
> + }
> +
> + us = host_to_us(host);
NAK. This condition can never happen; if it does then there's a bug in
the SCSI core and the system _should_ oops.
This routine is called from only one place: scsi_alloc_target(). In
that routine, starget->dev.parent is explicitly set to point at a
Scsi_Host. The NULL return you're worried about cannot happen in that
case, because the "while" loop will not execute at all:
static inline struct Scsi_Host *dev_to_shost(struct device *dev)
{
while (!scsi_is_host_device(dev)) {
if (!dev->parent)
return NULL;
dev = dev->parent;
}
return container_of(dev, struct Scsi_Host, shost_gendev);
}
Alan Stern
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html