From patchwork Tue Dec 2 15:07:50 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tadeusz Struk X-Patchwork-Id: 5420661 X-Patchwork-Delegate: herbert@gondor.apana.org.au Return-Path: X-Original-To: patchwork-linux-crypto@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 85C689F319 for ; Tue, 2 Dec 2014 15:10:51 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id BDB1820225 for ; Tue, 2 Dec 2014 15:10:50 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id DD5F12021F for ; Tue, 2 Dec 2014 15:10:49 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932278AbaLBPKt (ORCPT ); Tue, 2 Dec 2014 10:10:49 -0500 Received: from mga11.intel.com ([192.55.52.93]:64254 "EHLO mga11.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932110AbaLBPKs (ORCPT ); Tue, 2 Dec 2014 10:10:48 -0500 Received: from fmsmga001.fm.intel.com ([10.253.24.23]) by fmsmga102.fm.intel.com with ESMTP; 02 Dec 2014 07:10:48 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.07,501,1413270000"; d="scan'208";a="631420298" Received: from mwdryfus-mobl1.amr.corp.intel.com (HELO [127.0.1.1]) ([10.254.88.29]) by fmsmga001.fm.intel.com with ESMTP; 02 Dec 2014 07:10:47 -0800 Subject: [PATCH v2] crypto: algif - Mark sgl end at the end of data To: herbert@gondor.apana.org.au From: Tadeusz Struk Cc: linux-crypto@vger.kernel.org, davem@davemloft.net Date: Tue, 02 Dec 2014 07:07:50 -0800 Message-ID: <20141202150750.32521.20584.stgit@tstruk-mobl1> User-Agent: StGit/0.15 MIME-Version: 1.0 Sender: linux-crypto-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-crypto@vger.kernel.org X-Spam-Status: No, score=-6.9 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_HI, T_RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Hi, algif_skcipher sends 127 sgl buffers for encryption regardless of how many buffers acctually have data to process, where the few first with valid len and the rest with zero len. This is not very eficient and may cause problems when algs do something like this without checking the buff lenght: for_each_sg(sgl, sg, sg_nents, i) sg_virt(sg) This patch marks the last one with data as the last one to process. Changes: v2 - use data len to find the last buffer instead of nents in RX list. Signed-off-by: Tadeusz Struk --- crypto/algif_skcipher.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) -- To unsubscribe from this list: send the line "unsubscribe linux-crypto" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html diff --git a/crypto/algif_skcipher.c b/crypto/algif_skcipher.c index f2a88a7..cde507f 100644 --- a/crypto/algif_skcipher.c +++ b/crypto/algif_skcipher.c @@ -414,6 +414,23 @@ unlock: return err ?: size; } +static int skcipher_get_nents_with_data(struct scatterlist *sg, int len) +{ + int nents; + + for (nents = 0; sg; sg = sg_next(sg)) { + if (!sg) + return nents; + + len -= sg->length; + if (!(len > 0)) + return nents; + nents++; + } + + return 0; +} + static int skcipher_recvmsg(struct kiocb *unused, struct socket *sock, struct msghdr *msg, size_t ignored, int flags) { @@ -437,6 +454,8 @@ static int skcipher_recvmsg(struct kiocb *unused, struct socket *sock, char __user *from = iov->iov_base; while (seglen) { + int nents; + sgl = list_first_entry(&ctx->tsgl, struct skcipher_sg_list, list); sg = sgl->sg; @@ -464,6 +483,8 @@ static int skcipher_recvmsg(struct kiocb *unused, struct socket *sock, if (!used) goto free; + nents = skcipher_get_nents_with_data(sg, used); + sg_mark_end(&sg[nents]); ablkcipher_request_set_crypt(&ctx->req, sg, ctx->rsgl.sg, used, ctx->iv); @@ -473,6 +494,7 @@ static int skcipher_recvmsg(struct kiocb *unused, struct socket *sock, crypto_ablkcipher_encrypt(&ctx->req) : crypto_ablkcipher_decrypt(&ctx->req), &ctx->completion); + sg_unmark_end(&sg[nents]); free: af_alg_free_sg(&ctx->rsgl);