| From 5528d03183fe5243416c706f64b1faa518b05130 Mon Sep 17 00:00:00 2001 |
| From: Varun Prakash <varun@chelsio.com> |
| Date: Tue, 25 Aug 2020 18:05:10 +0530 |
| Subject: scsi: target: iscsi: Fix data digest calculation |
| |
| From: Varun Prakash <varun@chelsio.com> |
| |
| commit 5528d03183fe5243416c706f64b1faa518b05130 upstream. |
| |
| Current code does not consider 'page_off' in data digest calculation. To |
| fix this, add a local variable 'first_sg' and set first_sg.offset to |
| sg->offset + page_off. |
| |
| Link: https://lore.kernel.org/r/1598358910-3052-1-git-send-email-varun@chelsio.com |
| Fixes: e48354ce078c ("iscsi-target: Add iSCSI fabric support for target v4.1") |
| Cc: <stable@vger.kernel.org> |
| Reviewed-by: Mike Christie <michael.christie@oralce.com> |
| Signed-off-by: Varun Prakash <varun@chelsio.com> |
| Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/target/iscsi/iscsi_target.c | 17 +++++++++++++++-- |
| 1 file changed, 15 insertions(+), 2 deletions(-) |
| |
| --- a/drivers/target/iscsi/iscsi_target.c |
| +++ b/drivers/target/iscsi/iscsi_target.c |
| @@ -1386,14 +1386,27 @@ static u32 iscsit_do_crypto_hash_sg( |
| sg = cmd->first_data_sg; |
| page_off = cmd->first_data_sg_off; |
| |
| + if (data_length && page_off) { |
| + struct scatterlist first_sg; |
| + u32 len = min_t(u32, data_length, sg->length - page_off); |
| + |
| + sg_init_table(&first_sg, 1); |
| + sg_set_page(&first_sg, sg_page(sg), len, sg->offset + page_off); |
| + |
| + ahash_request_set_crypt(hash, &first_sg, NULL, len); |
| + crypto_ahash_update(hash); |
| + |
| + data_length -= len; |
| + sg = sg_next(sg); |
| + } |
| + |
| while (data_length) { |
| - u32 cur_len = min_t(u32, data_length, (sg->length - page_off)); |
| + u32 cur_len = min_t(u32, data_length, sg->length); |
| |
| ahash_request_set_crypt(hash, sg, NULL, cur_len); |
| crypto_ahash_update(hash); |
| |
| data_length -= cur_len; |
| - page_off = 0; |
| /* iscsit_map_iovec has already checked for invalid sg pointers */ |
| sg = sg_next(sg); |
| } |