lkml.org 
[lkml]   [2020]   [Jan]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.19 572/639] crypto: hisilicon - Matching the dma address for dma_pool_free()
    Date
    From: Yunfeng Ye <yeyunfeng@huawei.com>

    [ Upstream commit e00371af1d4ce73d527d8ee69fda2febaf5a42c2 ]

    When dma_pool_zalloc() fail in sec_alloc_and_fill_hw_sgl(),
    dma_pool_free() is invoked, but the parameters that sgl_current and
    sgl_current->next_sgl is not match.

    Using sec_free_hw_sgl() instead of the original free routine.

    Fixes: 915e4e8413da ("crypto: hisilicon - SEC security accelerator driver")
    Signed-off-by: Yunfeng Ye <yeyunfeng@huawei.com>
    Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/crypto/hisilicon/sec/sec_algs.c | 44 +++++++++++--------------
    1 file changed, 19 insertions(+), 25 deletions(-)

    diff --git a/drivers/crypto/hisilicon/sec/sec_algs.c b/drivers/crypto/hisilicon/sec/sec_algs.c
    index db2983c51f1e6..bf9658800bda5 100644
    --- a/drivers/crypto/hisilicon/sec/sec_algs.c
    +++ b/drivers/crypto/hisilicon/sec/sec_algs.c
    @@ -153,6 +153,24 @@ static void sec_alg_skcipher_init_context(struct crypto_skcipher *atfm,
    ctx->cipher_alg);
    }

    +static void sec_free_hw_sgl(struct sec_hw_sgl *hw_sgl,
    + dma_addr_t psec_sgl, struct sec_dev_info *info)
    +{
    + struct sec_hw_sgl *sgl_current, *sgl_next;
    + dma_addr_t sgl_next_dma;
    +
    + sgl_current = hw_sgl;
    + while (sgl_current) {
    + sgl_next = sgl_current->next;
    + sgl_next_dma = sgl_current->next_sgl;
    +
    + dma_pool_free(info->hw_sgl_pool, sgl_current, psec_sgl);
    +
    + sgl_current = sgl_next;
    + psec_sgl = sgl_next_dma;
    + }
    +}
    +
    static int sec_alloc_and_fill_hw_sgl(struct sec_hw_sgl **sec_sgl,
    dma_addr_t *psec_sgl,
    struct scatterlist *sgl,
    @@ -199,36 +217,12 @@ static int sec_alloc_and_fill_hw_sgl(struct sec_hw_sgl **sec_sgl,
    return 0;

    err_free_hw_sgls:
    - sgl_current = *sec_sgl;
    - while (sgl_current) {
    - sgl_next = sgl_current->next;
    - dma_pool_free(info->hw_sgl_pool, sgl_current,
    - sgl_current->next_sgl);
    - sgl_current = sgl_next;
    - }
    + sec_free_hw_sgl(*sec_sgl, *psec_sgl, info);
    *psec_sgl = 0;

    return ret;
    }

    -static void sec_free_hw_sgl(struct sec_hw_sgl *hw_sgl,
    - dma_addr_t psec_sgl, struct sec_dev_info *info)
    -{
    - struct sec_hw_sgl *sgl_current, *sgl_next;
    - dma_addr_t sgl_next_dma;
    -
    - sgl_current = hw_sgl;
    - while (sgl_current) {
    - sgl_next = sgl_current->next;
    - sgl_next_dma = sgl_current->next_sgl;
    -
    - dma_pool_free(info->hw_sgl_pool, sgl_current, psec_sgl);
    -
    - sgl_current = sgl_next;
    - psec_sgl = sgl_next_dma;
    - }
    -}
    -
    static int sec_alg_skcipher_setkey(struct crypto_skcipher *tfm,
    const u8 *key, unsigned int keylen,
    enum sec_cipher_alg alg)
    --
    2.20.1


    \
     
     \ /
      Last update: 2020-01-24 12:32    [W:4.783 / U:0.916 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site