Patch "scsi: sg: check for valid direction before starting the request" has been added to the 3.18-stable tree
Subsystems (3)
This is a note to let you know that I've just added the patch titled
scsi: sg: check for valid direction before starting the request
to the 3.18-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-sg-check-for-valid-direction-before-starting-the-request.patch
and it can be found in the queue-3.18 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 foo@baz Mon Mar 19 10:11:52 CET 2018
From: Johannes Thumshirn <[email protected]>
Date: Fri, 7 Apr 2017 09:34:15 +0200
Subject: scsi: sg: check for valid direction before starting the request
From: Johannes Thumshirn <[email protected]>
[ Upstream commit 28676d869bbb5257b5f14c0c95ad3af3a7019dd5 ]
Check for a valid direction before starting the request, otherwise we risk running into an assertion in the scsi midlayer checking for valid requests.
[mkp: fixed typo]
--- drivers/scsi/sg.c | 46 ++++++++++++++++++++++++++++++++++------------ 1 file changed, 34 insertions(+), 12 deletions(-)
drivers/scsi/sg.c +34 -12
@@ -674,18 +674,14 @@ sg_write(struct file *filp, const char _* is a non-zero input_size, so emit a warning. */ if (hp->dxfer_direction ==SG_DXFER_TO_FROM_DEV ) { -static char cmd[TASK_COMM_LEN ]; -if (strcmp (current->comm, cmd)) { -printk_ratelimited (KERN_WARNING -"sg_write: data in/out %d/%d bytes " -"for SCSI command 0x%x-- guessing " -"data in;\n program %s not setting " -"count and/or reply_len properly\n" , - old_hdr.reply_len - (int )SZ_SG_HEADER , - input_size, (unsigned int ) cmnd[0 ], - current->comm); -strcpy (cmd, current->comm); - } +printk_ratelimited (KERN_WARNING +"sg_write: data in/out %d/%d bytes " +"for SCSI command 0x%x-- guessing " +"data in;\n program %s not setting " +"count and/or reply_len properly\n" , + old_hdr.reply_len - (int )SZ_SG_HEADER , + input_size, (unsigned int ) cmnd[0 ], + current->comm); } k =sg_common_write (sfp, srp, cmnd, sfp->timeout, blocking);return (k <0 ) ? k : count;
@@ -764,6 +760,29 @@ sg_new_write(Sg_fd *sfp, struct file *fireturn count; } +static bool sg_is_valid_dxfer (sg_io_hdr_t *hp) +{ +switch (hp->dxfer_direction) { +case SG_DXFER_NONE : +if (hp->dxferp || hp->dxfer_len >0 ) +return false; +return true; +case SG_DXFER_TO_DEV : +case SG_DXFER_FROM_DEV : +case SG_DXFER_TO_FROM_DEV : +if (!hp->dxferp || hp->dxfer_len ==0 ) +return false; +return true; +case SG_DXFER_UNKNOWN : +if ((!hp->dxferp && hp->dxfer_len) || + (hp->dxferp && hp->dxfer_len ==0 )) +return false; +return true; +default : +return false; + } +} +static int sg_common_write (Sg_fd * sfp,Sg_request * srp,unsigned char *cmnd,int timeout,int blocking)
@@ -784,6 +803,9 @@ sg_common_write(Sg_fd * sfp, Sg_request"sg_common_write: scsi opcode=0x%02x, cmd_size=%d\n" , (int) cmnd[0], (int) hp->cmd_len)); +if (!sg_is_valid_dxfer (hp)) +return -EINVAL ; + k =sg_start_req (srp, cmnd);if (k) { SCSI_LOG_TIMEOUT(1, sg_printk(KERN_INFO, sfp->parentdp,
Patches currently in stable-queue which might be from [email protected] are
queue-3.18/scsi-sg-check-for-valid-direction-before-starting-the-request.patch queue-3.18/scsi-sg-close-race-condition-in-sg_remove_sfp_usercontext.patch