Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

libata: array underflow in ata_find_dev()

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>
Cc: stable@vger.kernel.org # all versions at this point

authored by

Dan Carpenter and committed by
Tejun Heo
59a5e266 6ac1d153

+4 -2
+4 -2
drivers/ata/libata-scsi.c
··· 3030 3030 static struct ata_device *ata_find_dev(struct ata_port *ap, int devno) 3031 3031 { 3032 3032 if (!sata_pmp_attached(ap)) { 3033 - if (likely(devno < ata_link_max_devices(&ap->link))) 3033 + if (likely(devno >= 0 && 3034 + devno < ata_link_max_devices(&ap->link))) 3034 3035 return &ap->link.device[devno]; 3035 3036 } else { 3036 - if (likely(devno < ap->nr_pmp_links)) 3037 + if (likely(devno >= 0 && 3038 + devno < ap->nr_pmp_links)) 3037 3039 return &ap->pmp_link[devno].device[0]; 3038 3040 } 3039 3041