|
@@ -888,6 +888,12 @@ sense_reason_t target_do_xcopy(struct se_cmd *se_cmd)
|
|
|
return TCM_UNSUPPORTED_SCSI_OPCODE;
|
|
|
}
|
|
|
|
|
|
+ if (se_cmd->data_length < XCOPY_HDR_LEN) {
|
|
|
+ pr_err("XCOPY parameter truncation: length %u < hdr_len %u\n",
|
|
|
+ se_cmd->data_length, XCOPY_HDR_LEN);
|
|
|
+ return TCM_PARAMETER_LIST_LENGTH_ERROR;
|
|
|
+ }
|
|
|
+
|
|
|
xop = kzalloc(sizeof(struct xcopy_op), GFP_KERNEL);
|
|
|
if (!xop) {
|
|
|
pr_err("Unable to allocate xcopy_op\n");
|
|
@@ -923,6 +929,14 @@ sense_reason_t target_do_xcopy(struct se_cmd *se_cmd)
|
|
|
goto out;
|
|
|
}
|
|
|
|
|
|
+ if (se_cmd->data_length < (XCOPY_HDR_LEN + tdll + sdll + inline_dl)) {
|
|
|
+ pr_err("XCOPY parameter truncation: data length %u too small "
|
|
|
+ "for tdll: %hu sdll: %u inline_dl: %u\n",
|
|
|
+ se_cmd->data_length, tdll, sdll, inline_dl);
|
|
|
+ ret = TCM_PARAMETER_LIST_LENGTH_ERROR;
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
+
|
|
|
pr_debug("Processing XCOPY with list_id: 0x%02x list_id_usage: 0x%02x"
|
|
|
" tdll: %hu sdll: %u inline_dl: %u\n", list_id, list_id_usage,
|
|
|
tdll, sdll, inline_dl);
|