Patch "SCSI: fix new bug in scsi_dev_info_list string matching" has been added to the 4.6-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
SCSI: fix new bug in scsi_dev_info_list string matching
to the 4.6-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
scsi-fix-new-bug-in-scsi_dev_info_list-string-matching.patch
and it can be found in the queue-4.6 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
5e7ff2ca7f2da55fe777167849d0c93403bd0dc8Mon Sep 17 00:00:00 2001
From: Alan Stern <[email protected]>
Date: Thu, 23 Jun 2016 15:05:26 -0400
Subject: SCSI: fix new bug in scsi_dev_info_list string matching
From: Alan Stern <[email protected]>
commit 5e7ff2ca7f2da55fe777167849d0c93403bd0dc8 upstream.
Commit b704f70ce200 ("SCSI: fix bug in scsi_dev_info_list matching") changed the way vendor- and model-string matching was carried out in the routine that looks up entries in a SCSI devinfo list. The new matching code failed to take into account the case of a maximum-length string; in such cases it could end up testing for a terminating '\0' byte beyond the end of the memory allocated to the string. This out-of-bounds bug was detected by UBSAN.
I don't know if anybody has actually encountered this bug. The symptom would be that a device entry in the blacklist might not be matched properly if it contained an 8-character vendor name or a 16-character model name. Such entries certainly exist in scsi_static_device_list.
This patch fixes the problem by adding a check for a maximum-length string before the '\0' test.
--- drivers/scsi/scsi_devinfo.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-)
drivers/scsi/scsi_devinfo.c +6 -4
@@ -429,7 +429,7 @@ static struct scsi_dev_info_list *scsi_d* here, and we don't know what device it is * trying to work with, leave it as-is. */ - vmax =8 ;/* max length of vendor */ + vmax =sizeof (devinfo->vendor); vskip = vendor;while (vmax >0 && *vskip ==' ' ) { vmax--;
@@ -439,7 +439,7 @@ static struct scsi_dev_info_list *scsi_dwhile (vmax >0 && vskip[vmax -1 ] ==' ' ) --vmax; - mmax =16 ;/* max length of model */ + mmax =sizeof (devinfo->model); mskip = model;while (mmax >0 && *mskip ==' ' ) { mmax--;
@@ -455,10 +455,12 @@ static struct scsi_dev_info_list *scsi_d* Behave like the older version of get_device_flags. */ if (memcmp (devinfo->vendor, vskip, vmax) || - devinfo->vendor[vmax]) + (vmax <sizeof (devinfo->vendor) && + devinfo->vendor[vmax]))continue ;if (memcmp (devinfo->model, mskip, mmax) || - devinfo->model[mmax]) + (mmax <sizeof (devinfo->model) && + devinfo->model[mmax]))continue ;return devinfo; }else {
Patches currently in stable-queue which might be from [email protected] are
queue-4.6/scsi-fix-new-bug-in-scsi_dev_info_list-string-matching.patch queue-4.6/usb-ohci-don-t-mark-eds-as-ed_oper-if-scheduling-fails.patch