mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-25 13:14:07 +08:00
crypto: hisilicon - Matching the dma address for dma_pool_free()
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: 915e4e8413
("crypto: hisilicon - SEC security accelerator driver")
Signed-off-by: Yunfeng Ye <yeyunfeng@huawei.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
This commit is contained in:
parent
24fbf7bad8
commit
e00371af1d
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user