|
@@ -3727,11 +3727,16 @@ core_scsi3_pri_read_keys(struct se_cmd *cmd)
|
|
|
* Check for overflow of 8byte PRI READ_KEYS payload and
|
|
|
* next reservation key list descriptor.
|
|
|
*/
|
|
|
- if ((add_len + 8) > (cmd->data_length - 8))
|
|
|
- break;
|
|
|
-
|
|
|
- put_unaligned_be64(pr_reg->pr_res_key, &buf[off]);
|
|
|
- off += 8;
|
|
|
+ if (off + 8 <= cmd->data_length) {
|
|
|
+ put_unaligned_be64(pr_reg->pr_res_key, &buf[off]);
|
|
|
+ off += 8;
|
|
|
+ }
|
|
|
+ /*
|
|
|
+ * SPC5r17: 6.16.2 READ KEYS service action
|
|
|
+ * The ADDITIONAL LENGTH field indicates the number of bytes in
|
|
|
+ * the Reservation key list. The contents of the ADDITIONAL
|
|
|
+ * LENGTH field are not altered based on the allocation length
|
|
|
+ */
|
|
|
add_len += 8;
|
|
|
}
|
|
|
spin_unlock(&dev->t10_pr.registration_lock);
|