diff options
author | Dan Carpenter <dan.carpenter@oracle.com> | 2017-07-19 06:06:41 -0400 |
---|---|---|
committer | Tejun Heo <tj@kernel.org> | 2017-07-19 10:31:51 -0400 |
commit | 59a5e266c3f5c1567508888dd61a45b86daed0fa (patch) | |
tree | f65ab2a5a55997eb1376f9234a0d51546a1c6150 | |
parent | 6ac1d1532c888b030acb3b4ac82425448cb15198 (diff) |
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
-rw-r--r-- | drivers/ata/libata-scsi.c | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c index d462c5a3a7ef..44ba292f2cd7 100644 --- a/drivers/ata/libata-scsi.c +++ b/drivers/ata/libata-scsi.c | |||
@@ -3030,10 +3030,12 @@ static unsigned int atapi_xlat(struct ata_queued_cmd *qc) | |||
3030 | static struct ata_device *ata_find_dev(struct ata_port *ap, int devno) | 3030 | static struct ata_device *ata_find_dev(struct ata_port *ap, int devno) |
3031 | { | 3031 | { |
3032 | if (!sata_pmp_attached(ap)) { | 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 | return &ap->link.device[devno]; | 3035 | return &ap->link.device[devno]; |
3035 | } else { | 3036 | } else { |
3036 | if (likely(devno < ap->nr_pmp_links)) | 3037 | if (likely(devno >= 0 && |
3038 | devno < ap->nr_pmp_links)) | ||
3037 | return &ap->pmp_link[devno].device[0]; | 3039 | return &ap->pmp_link[devno].device[0]; |
3038 | } | 3040 | } |
3039 | 3041 | ||