summaryrefslogtreecommitdiffstats
path: root/drivers/ata
diff options
context:
space:
mode:
authorDan Carpenter <dan.carpenter@oracle.com>2017-07-19 13:06:41 +0300
committerBen Hutchings <ben@decadent.org.uk>2017-11-11 13:33:00 +0000
commit292e98fc5ef1144637f87f5a9dd5d53c1ff833cd (patch)
treeccf7e5119fef479c84a578ae7a372aa43ae2ee79 /drivers/ata
parent1b0326513bc8b9a3bd77f00e64b0e2e16f24b1cf (diff)
downloadlinux-stable-292e98fc5ef1144637f87f5a9dd5d53c1ff833cd.tar.gz
linux-stable-292e98fc5ef1144637f87f5a9dd5d53c1ff833cd.tar.bz2
linux-stable-292e98fc5ef1144637f87f5a9dd5d53c1ff833cd.zip
libata: array underflow in ata_find_dev()
commit 59a5e266c3f5c1567508888dd61a45b86daed0fa upstream. My static checker complains that "devno" can be negative, meaning that we read before the start of the loop. I've looked at the code, and I think the warning is right. This come from /proc so it's root only or it would be quite a quite a serious bug. The call tree looks like this: proc_scsi_write() <- gets id and channel from simple_strtoul() -> scsi_add_single_device() <- calls shost->transportt->user_scan() -> ata_scsi_user_scan() -> ata_find_dev() Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com> Signed-off-by: Tejun Heo <tj@kernel.org> Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
Diffstat (limited to 'drivers/ata')
-rw-r--r--drivers/ata/libata-scsi.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c
index 90112092d1e6..b297d43e1121 100644
--- a/drivers/ata/libata-scsi.c
+++ b/drivers/ata/libata-scsi.c
@@ -2796,10 +2796,12 @@ static unsigned int atapi_xlat(struct ata_queued_cmd *qc)
static struct ata_device *ata_find_dev(struct ata_port *ap, int devno)
{
if (!sata_pmp_attached(ap)) {
- if (likely(devno < ata_link_max_devices(&ap->link)))
+ if (likely(devno >= 0 &&
+ devno < ata_link_max_devices(&ap->link)))
return &ap->link.device[devno];
} else {
- if (likely(devno < ap->nr_pmp_links))
+ if (likely(devno >= 0 &&
+ devno < ap->nr_pmp_links))
return &ap->pmp_link[devno].device[0];
}