diff options
| author | Dinghao Liu <dinghao.liu@zju.edu.cn> | 2023-11-27 11:47:10 +0800 |
|---|---|---|
| committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2024-01-25 14:34:23 -0800 |
| commit | ca3484d5cadc39a075d3509b3f8988c9d7223b8e (patch) | |
| tree | a316197c00ed9d761015c26c8ded260d700fcde5 /drivers/crypto | |
| parent | 9fffae6cc42b65c02cab2c2937bd7ce8f0410e06 (diff) | |
| download | linux-ca3484d5cadc39a075d3509b3f8988c9d7223b8e.tar.gz linux-ca3484d5cadc39a075d3509b3f8988c9d7223b8e.tar.bz2 linux-ca3484d5cadc39a075d3509b3f8988c9d7223b8e.zip | |
crypto: ccp - fix memleak in ccp_init_dm_workarea
[ Upstream commit a1c95dd5bc1d6a5d7a75a376c2107421b7d6240d ]
When dma_map_single() fails, wa->address is supposed to be freed
by the callers of ccp_init_dm_workarea() through ccp_dm_free().
However, many of the call spots don't expect to have to call
ccp_dm_free() on failure of ccp_init_dm_workarea(), which may
lead to a memleak. Let's free wa->address in ccp_init_dm_workarea()
when dma_map_single() fails.
Fixes: 63b945091a07 ("crypto: ccp - CCP device driver and interface support")
Signed-off-by: Dinghao Liu <dinghao.liu@zju.edu.cn>
Acked-by: Tom Lendacky <thomas.lendacky@amd.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: Sasha Levin <sashal@kernel.org>
Diffstat (limited to 'drivers/crypto')
| -rw-r--r-- | drivers/crypto/ccp/ccp-ops.c | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/drivers/crypto/ccp/ccp-ops.c b/drivers/crypto/ccp/ccp-ops.c index e826c4b6b3af..4865eb047866 100644 --- a/drivers/crypto/ccp/ccp-ops.c +++ b/drivers/crypto/ccp/ccp-ops.c @@ -178,8 +178,11 @@ static int ccp_init_dm_workarea(struct ccp_dm_workarea *wa, wa->dma.address = dma_map_single(wa->dev, wa->address, len, dir); - if (dma_mapping_error(wa->dev, wa->dma.address)) + if (dma_mapping_error(wa->dev, wa->dma.address)) { + kfree(wa->address); + wa->address = NULL; return -ENOMEM; + } wa->dma.length = len; } |
