Patch "scsi: core: Fix a scsi_show_rq() NULL pointer dereference" has been added to the 4.14-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
scsi: core: Fix a scsi_show_rq() NULL pointer dereference
to the 4.14-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-core-fix-a-scsi_show_rq-null-pointer-dereference.patch
and it can be found in the queue-4.14 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
14e3062fb18532175af4d1c4073597999f7a2248Mon Sep 17 00:00:00 2001
From: Bart Van Assche <[email protected]>
Date: Tue, 5 Dec 2017 16:57:51 -0800
Subject: scsi: core: Fix a scsi_show_rq() NULL pointer dereference
From: Bart Van Assche <[email protected]>
commit 14e3062fb18532175af4d1c4073597999f7a2248 upstream.
Avoid that scsi_show_rq() triggers a NULL pointer dereference if called after sd_uninit_command(). Swap the NULL pointer assignment and the mempool_free() call in sd_uninit_command() to make it less likely that scsi_show_rq() triggers a use-after-free. Note: even with these changes scsi_show_rq() can trigger a use-after-free but that's a lesser evil than e.g. suppressing debug information for T10 PI Type 2 commands completely. This patch fixes the following oops:
BUG: unable to handle kernel NULL pointer dereference at (null) IP: scsi_format_opcode_name+0x1a/0x1c0 CPU: 1 PID: 1881 Comm: cat Not tainted 4.14.0-rc2.blk_mq_io_hang+ #516 Call Trace: __scsi_format_command+0x27/0xc0 scsi_show_rq+0x5c/0xc0 __blk_mq_debugfs_rq_show+0x116/0x130 blk_mq_debugfs_rq_show+0xe/0x10 seq_read+0xfe/0x3b0 full_proxy_read+0x54/0x90 __vfs_read+0x37/0x160 vfs_read+0x96/0x130 SyS_read+0x55/0xc0 entry_SYSCALL_64_fastpath+0x1a/0xa5
[mkp: added Type 2]
--- drivers/scsi/scsi_debugfs.c | 6 ++++-- drivers/scsi/sd.c | 4 +++- 2 files changed, 7 insertions(+), 3 deletions(-)
drivers/scsi/scsi_debugfs.c +4 -2
@@ -8,9 +8,11 @@ void scsi_show_rq(struct seq_file *m, st {struct scsi_cmnd *cmd =container_of (scsi_req (rq),typeof (*cmd), req);int msecs =jiffies_to_msecs (jiffies - cmd->jiffies_at_alloc); -char buf[80 ]; +const u8 *const cdb =READ_ONCE (cmd->cmnd); +char buf[80 ] ="(?)" ; -__scsi_format_command (buf,sizeof (buf), cmd->cmnd, cmd->cmd_len); +if (cdb) +__scsi_format_command (buf,sizeof (buf), cdb, cmd->cmd_len);seq_printf (m,", .cmd=%s, .retries=%d, allocated %d.%03d s ago" , buf, cmd->retries, msecs /1000 , msecs %1000 ); }
drivers/scsi/sd.c +3 -1
@@ -1284,6 +1284,7 @@ static int sd_init_command(struct scsi_cstatic void sd_uninit_command (struct scsi_cmnd *SCpnt) {struct request *rq = SCpnt->request; +u8 *cmnd;if (SCpnt->flags &SCMD_ZONE_WRITE_LOCK )sd_zbc_write_unlock_zone (SCpnt);
@@ -1292,9 +1293,10 @@ static void sd_uninit_command(struct scs__free_page (rq->special_vec.bv_page);if (SCpnt->cmnd !=scsi_req (rq)->cmd) { -mempool_free (SCpnt->cmnd, sd_cdb_pool); + cmnd = SCpnt->cmnd; SCpnt->cmnd =NULL ; SCpnt->cmd_len =0 ; +mempool_free (cmnd, sd_cdb_pool); } }
Patches currently in stable-queue which might be from [email protected] are
queue-4.14/scsi-core-fix-a-scsi_show_rq-null-pointer-dereference.patch