crypto: ccp - fix memleak in ccp_init_dm_workarea
authorDinghao Liu <dinghao.liu@zju.edu.cn>
Mon, 27 Nov 2023 03:47:10 +0000 (11:47 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 25 Jan 2024 23:35:16 +0000 (15:35 -0800)
[ 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>
drivers/crypto/ccp/ccp-ops.c

index aa4e1a5..cb8e999 100644 (file)
@@ -179,8 +179,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;
        }