From 5e90abb64ac779e6ec4992b8dd27e4ca938de8e3 Mon Sep 17 00:00:00 2001 From: Bart Van Assche Date: Wed, 1 Sep 2021 04:33:22 +0000 Subject: [PATCH] scst_copy_mgr: Implement a workaround for non-compliant initiator systems Reported-by: Eitan Cohen git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@9498 d57e44dd-8a1f-0410-8b47-8ef2f437770f --- scst/src/scst_copy_mgr.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/scst/src/scst_copy_mgr.c b/scst/src/scst_copy_mgr.c index c21a83e32..7fa922c32 100644 --- a/scst/src/scst_copy_mgr.c +++ b/scst/src/scst_copy_mgr.c @@ -2944,6 +2944,8 @@ static int scst_cm_parse_id_tgt_descr(struct scst_cmd *cmd, const uint8_t *seg, /* ToDo: make it hash based */ list_for_each_entry(des, &scst_cm_desig_list, cm_desig_list_entry) { + uint8_t cmp_len; + TRACE_DBG("des %p (tgt_dev %p, lun %lld)", des, des->desig_tgt_dev, (unsigned long long)des->desig_tgt_dev->lun); if (seg[4] != des->desig[0]) @@ -2952,7 +2954,14 @@ static int scst_cm_parse_id_tgt_descr(struct scst_cmd *cmd, const uint8_t *seg, continue; if (seg[7] > des->desig[3]) continue; - if (memcmp(&des->desig[4], &seg[8], min_t(int, seg[7], des->desig[3])) == 0) { + /* + * From SPC-6: "The designator length shall be 20 or less". + * However, both libiscsi and sg_copy may specify a designator + * length > 20 bytes while truncating the designator to 20 + * bytes. Hence the code below that restricts cmp_len to 20. + */ + cmp_len = min_t(u8, min(seg[7], des->desig[3]), 20); + if (memcmp(&des->desig[4], &seg[8], cmp_len) == 0) { TRACE_DBG("Tgt_dev %p (lun %lld) found", des->desig_tgt_dev, (unsigned long long)des->desig_tgt_dev->lun);