crypto: ccree - don't map AEAD key and IV on stack
The AEAD authenc key and IVs might be passed to us on stack. Copy it to a slab buffer before mapping to gurantee proper DMA mapping. Signed-off-by: Gilad Ben-Yossef <gilad@benyossef.com> Cc: stable@vger.kernel.org # v4.19+ Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
This commit is contained in:

committed by
Herbert Xu

parent
874e163759
commit
e8662a6a5f
@@ -557,6 +557,7 @@ void cc_unmap_aead_request(struct device *dev, struct aead_request *req)
|
||||
if (areq_ctx->gen_ctx.iv_dma_addr) {
|
||||
dma_unmap_single(dev, areq_ctx->gen_ctx.iv_dma_addr,
|
||||
hw_iv_size, DMA_BIDIRECTIONAL);
|
||||
kzfree(areq_ctx->gen_ctx.iv);
|
||||
}
|
||||
|
||||
/* Release pool */
|
||||
@@ -607,19 +608,27 @@ static int cc_aead_chain_iv(struct cc_drvdata *drvdata,
|
||||
struct aead_req_ctx *areq_ctx = aead_request_ctx(req);
|
||||
unsigned int hw_iv_size = areq_ctx->hw_iv_size;
|
||||
struct device *dev = drvdata_to_dev(drvdata);
|
||||
gfp_t flags = cc_gfp_flags(&req->base);
|
||||
int rc = 0;
|
||||
|
||||
if (!req->iv) {
|
||||
areq_ctx->gen_ctx.iv_dma_addr = 0;
|
||||
areq_ctx->gen_ctx.iv = NULL;
|
||||
goto chain_iv_exit;
|
||||
}
|
||||
|
||||
areq_ctx->gen_ctx.iv_dma_addr = dma_map_single(dev, req->iv,
|
||||
hw_iv_size,
|
||||
DMA_BIDIRECTIONAL);
|
||||
areq_ctx->gen_ctx.iv = kmemdup(req->iv, hw_iv_size, flags);
|
||||
if (!areq_ctx->gen_ctx.iv)
|
||||
return -ENOMEM;
|
||||
|
||||
areq_ctx->gen_ctx.iv_dma_addr =
|
||||
dma_map_single(dev, areq_ctx->gen_ctx.iv, hw_iv_size,
|
||||
DMA_BIDIRECTIONAL);
|
||||
if (dma_mapping_error(dev, areq_ctx->gen_ctx.iv_dma_addr)) {
|
||||
dev_err(dev, "Mapping iv %u B at va=%pK for DMA failed\n",
|
||||
hw_iv_size, req->iv);
|
||||
kzfree(areq_ctx->gen_ctx.iv);
|
||||
areq_ctx->gen_ctx.iv = NULL;
|
||||
rc = -ENOMEM;
|
||||
goto chain_iv_exit;
|
||||
}
|
||||
|
Reference in New Issue
Block a user