Skip to content

Commit ccd3f44

Browse files
mikechristiemartinkpetersen
authored andcommitted
scsi: target: Fix WRITE_SAME No Data Buffer crash
In newer version of the SBC specs, we have a NDOB bit that indicates there is no data buffer that gets written out. If this bit is set using commands like "sg_write_same --ndob" we will crash in target_core_iblock/file's execute_write_same handlers when we go to access the se_cmd->t_data_sg because its NULL. This patch adds a check for the NDOB bit in the common WRITE SAME code because we don't support it. And, it adds a check for zero SG elements in each handler in case the initiator tries to send a normal WRITE SAME with no data buffer. Link: https://lore.kernel.org/r/[email protected] Reviewed-by: Christoph Hellwig <[email protected]> Signed-off-by: Mike Christie <[email protected]> Signed-off-by: Martin K. Petersen <[email protected]>
1 parent fce54ed commit ccd3f44

File tree

3 files changed

+13
-0
lines changed

3 files changed

+13
-0
lines changed

drivers/target/target_core_file.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -448,6 +448,9 @@ fd_execute_write_same(struct se_cmd *cmd)
448448
return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
449449
}
450450

451+
if (!cmd->t_data_nents)
452+
return TCM_INVALID_CDB_FIELD;
453+
451454
if (cmd->t_data_nents > 1 ||
452455
cmd->t_data_sg[0].length != cmd->se_dev->dev_attrib.block_size) {
453456
pr_err("WRITE_SAME: Illegal SGL t_data_nents: %u length: %u"

drivers/target/target_core_iblock.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -494,6 +494,10 @@ iblock_execute_write_same(struct se_cmd *cmd)
494494
" backends not supported\n");
495495
return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
496496
}
497+
498+
if (!cmd->t_data_nents)
499+
return TCM_INVALID_CDB_FIELD;
500+
497501
sg = &cmd->t_data_sg[0];
498502

499503
if (cmd->t_data_nents > 1 ||

drivers/target/target_core_sbc.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -312,6 +312,12 @@ sbc_setup_write_same(struct se_cmd *cmd, unsigned char flags, struct sbc_ops *op
312312
pr_warn("WRITE SAME with ANCHOR not supported\n");
313313
return TCM_INVALID_CDB_FIELD;
314314
}
315+
316+
if (flags & 0x01) {
317+
pr_warn("WRITE SAME with NDOB not supported\n");
318+
return TCM_INVALID_CDB_FIELD;
319+
}
320+
315321
/*
316322
* Special case for WRITE_SAME w/ UNMAP=1 that ends up getting
317323
* translated into block discard requests within backend code.

0 commit comments

Comments
 (0)