From patchwork Wed Jul 10 09:53:24 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Fiona Trahe X-Patchwork-Id: 56290 X-Patchwork-Delegate: gakhil@marvell.com Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 3AC8D2E81; Wed, 10 Jul 2019 11:53:29 +0200 (CEST) Received: from mga04.intel.com (mga04.intel.com [192.55.52.120]) by dpdk.org (Postfix) with ESMTP id DE6E12C23 for ; Wed, 10 Jul 2019 11:53:27 +0200 (CEST) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga007.fm.intel.com ([10.253.24.52]) by fmsmga104.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 10 Jul 2019 02:53:27 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.63,474,1557212400"; d="scan'208";a="167682915" Received: from sivswdev09.ir.intel.com (HELO localhost.localdomain) ([10.237.217.48]) by fmsmga007.fm.intel.com with ESMTP; 10 Jul 2019 02:53:25 -0700 From: Fiona Trahe To: dev@dpdk.org Cc: akhil.goyal@nxp.com, fiona.trahe@intel.com, damianx.nowak@intel.com, konstantin.ananyev@intel.com Date: Wed, 10 Jul 2019 10:53:24 +0100 Message-Id: <1562752404-14017-1-git-send-email-fiona.trahe@intel.com> X-Mailer: git-send-email 1.7.0.7 Subject: [dpdk-dev] [PATCH] crypto/qat: fix seg-fault X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" Fix for seg-faults occurring: 1) in buffer re-alignment in-place sgl case 2) case where data end is exactly at end of an sgl segment. Also renamed variable and increased comments for clearer code. Fixes: 40002f6c2a24 ("crypto/qat: extend support for digest-encrypted auth-cipher") Signed-off-by: Fiona Trahe Tested-by: Konstantin Ananyev Acked-by: Damian Nowak --- drivers/crypto/qat/qat_sym.c | 35 ++++++++++++++++++++++------------- 1 files changed, 22 insertions(+), 13 deletions(-) diff --git a/drivers/crypto/qat/qat_sym.c b/drivers/crypto/qat/qat_sym.c index 2dc0614..46ef27a 100644 --- a/drivers/crypto/qat/qat_sym.c +++ b/drivers/crypto/qat/qat_sym.c @@ -156,9 +156,10 @@ uint32_t auth_len = 0, auth_ofs = 0; uint32_t min_ofs = 0; uint64_t src_buf_start = 0, dst_buf_start = 0; - uint64_t digest_start = 0; + uint64_t auth_data_end = 0; uint8_t do_sgl = 0; uint8_t in_place = 1; + int alignment_adjustment = 0; struct rte_crypto_op *op = (struct rte_crypto_op *)in_op; struct qat_sym_op_cookie *cookie = (struct qat_sym_op_cookie *)op_cookie; @@ -465,6 +466,10 @@ min_ofs); } dst_buf_start = src_buf_start; + + /* remember any adjustment for later, note, can be +/- */ + alignment_adjustment = src_buf_start - + rte_pktmbuf_iova_offset(op->sym->m_src, min_ofs); } if (do_cipher || do_aead) { @@ -494,33 +499,37 @@ : (auth_param->auth_off + auth_param->auth_len); if (do_auth && do_cipher) { + /* Handle digest-encrypted cases, i.e. + * auth-gen-then-cipher-encrypt and + * cipher-decrypt-then-auth-verify + */ + /* First find the end of the data */ if (do_sgl) { uint32_t remaining_off = auth_param->auth_off + - auth_param->auth_len; + auth_param->auth_len + alignment_adjustment; struct rte_mbuf *sgl_buf = (in_place ? - op->sym->m_src : op->sym->m_dst); - while (remaining_off >= rte_pktmbuf_data_len( - sgl_buf)) { - remaining_off -= rte_pktmbuf_data_len( - sgl_buf); + op->sym->m_src : op->sym->m_dst); + + while (remaining_off >= rte_pktmbuf_data_len(sgl_buf) + && sgl_buf->next != NULL) { + remaining_off -= rte_pktmbuf_data_len(sgl_buf); sgl_buf = sgl_buf->next; } - digest_start = (uint64_t)rte_pktmbuf_iova_offset( + + auth_data_end = (uint64_t)rte_pktmbuf_iova_offset( sgl_buf, remaining_off); } else { - digest_start = (in_place ? + auth_data_end = (in_place ? src_buf_start : dst_buf_start) + auth_param->auth_off + auth_param->auth_len; } - /* Handle cases of auth-gen-then-cipher and - * cipher-decrypt-then-auth-verify with digest encrypted - */ + /* Then check if digest-encrypted conditions are met */ if ((auth_param->auth_off + auth_param->auth_len < cipher_param->cipher_offset + cipher_param->cipher_length) && (op->sym->auth.digest.phys_addr == - digest_start)) { + auth_data_end)) { /* Handle partial digest encryption */ if (cipher_param->cipher_offset + cipher_param->cipher_length <