crypto: hisilicon - Fix double free in sec_free_hw_sgl()
There are two problems in sec_free_hw_sgl():
First, when sgl_current->next is valid, @hw_sgl will be freed in the
first loop, but it free again after the loop.
Second, sgl_current and sgl_current->next_sgl is not match when
dma_pool_free() is invoked, the third parameter should be the dma
address of sgl_current, but sgl_current->next_sgl is the dma address
of next chain, so use sgl_current->next_sgl is wrong.
Fix this by deleting the last dma_pool_free() in sec_free_hw_sgl(),
modifying the condition for while loop, and matching the address for
dma_pool_free().
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>
Этот коммит содержится в:

коммит произвёл
Herbert Xu

родитель
212ef6f29e
Коммит
24fbf7bad8
@@ -215,17 +215,18 @@ 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;
|
||||
|
||||
if (!hw_sgl)
|
||||
return;
|
||||
sgl_current = hw_sgl;
|
||||
while (sgl_current->next) {
|
||||
while (sgl_current) {
|
||||
sgl_next = sgl_current->next;
|
||||
dma_pool_free(info->hw_sgl_pool, sgl_current,
|
||||
sgl_current->next_sgl);
|
||||
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;
|
||||
}
|
||||
dma_pool_free(info->hw_sgl_pool, hw_sgl, psec_sgl);
|
||||
}
|
||||
|
||||
static int sec_alg_skcipher_setkey(struct crypto_skcipher *tfm,
|
||||
|
Ссылка в новой задаче
Block a user