Commit 715ad0f1 authored by Dan Carpenter's avatar Dan Carpenter Committed by Greg Kroah-Hartman

libata: array underflow in ata_find_dev()

commit 59a5e266 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: default avatarDan Carpenter <dan.carpenter@oracle.com>
Signed-off-by: default avatarTejun Heo <tj@kernel.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent a34eddfe
...@@ -2798,10 +2798,12 @@ static unsigned int atapi_xlat(struct ata_queued_cmd *qc) ...@@ -2798,10 +2798,12 @@ static unsigned int atapi_xlat(struct ata_queued_cmd *qc)
static struct ata_device *ata_find_dev(struct ata_port *ap, int devno) static struct ata_device *ata_find_dev(struct ata_port *ap, int devno)
{ {
if (!sata_pmp_attached(ap)) { 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]; return &ap->link.device[devno];
} else { } else {
if (likely(devno < ap->nr_pmp_links)) if (likely(devno >= 0 &&
devno < ap->nr_pmp_links))
return &ap->pmp_link[devno].device[0]; return &ap->pmp_link[devno].device[0];
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment