aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRomain Perier <romain.perier@free-electrons.com>2016-07-22 08:40:39 -0400
committerHerbert Xu <herbert@gondor.apana.org.au>2016-07-28 01:04:42 -0400
commitec38f82e85532bdde27af8dea8e6c09e26f88e16 (patch)
tree165ec23b29c0f2a06adb6aadd9042e6c8a11c87d
parentbbce2ad2d711c12d93145a7bbdf086e73f414bcd (diff)
crypto: marvell - Fix memory leaks in TDMA chain for cipher requests
So far in mv_cesa_ablkcipher_dma_req_init, if an error is thrown while the tdma chain is built there is a memory leak. This issue exists because the chain is assigned later at the end of the function, so the cleanup function is called with the wrong version of the chain. Fixes: db509a45339f ("crypto: marvell/cesa - add TDMA support") Signed-off-by: Romain Perier <romain.perier@free-electrons.com> Acked-by: Boris Brezillon <boris.brezillon@free-electrons.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-rw-r--r--drivers/crypto/marvell/cipher.c14
1 files changed, 6 insertions, 8 deletions
diff --git a/drivers/crypto/marvell/cipher.c b/drivers/crypto/marvell/cipher.c
index 48df03a06066..8391aba04f2b 100644
--- a/drivers/crypto/marvell/cipher.c
+++ b/drivers/crypto/marvell/cipher.c
@@ -320,7 +320,6 @@ static int mv_cesa_ablkcipher_dma_req_init(struct ablkcipher_request *req,
320 GFP_KERNEL : GFP_ATOMIC; 320 GFP_KERNEL : GFP_ATOMIC;
321 struct mv_cesa_req *basereq = &creq->base; 321 struct mv_cesa_req *basereq = &creq->base;
322 struct mv_cesa_ablkcipher_dma_iter iter; 322 struct mv_cesa_ablkcipher_dma_iter iter;
323 struct mv_cesa_tdma_chain chain;
324 bool skip_ctx = false; 323 bool skip_ctx = false;
325 int ret; 324 int ret;
326 unsigned int ivsize; 325 unsigned int ivsize;
@@ -347,13 +346,13 @@ static int mv_cesa_ablkcipher_dma_req_init(struct ablkcipher_request *req,
347 return -ENOMEM; 346 return -ENOMEM;
348 } 347 }
349 348
350 mv_cesa_tdma_desc_iter_init(&chain); 349 mv_cesa_tdma_desc_iter_init(&basereq->chain);
351 mv_cesa_ablkcipher_req_iter_init(&iter, req); 350 mv_cesa_ablkcipher_req_iter_init(&iter, req);
352 351
353 do { 352 do {
354 struct mv_cesa_op_ctx *op; 353 struct mv_cesa_op_ctx *op;
355 354
356 op = mv_cesa_dma_add_op(&chain, op_templ, skip_ctx, flags); 355 op = mv_cesa_dma_add_op(&basereq->chain, op_templ, skip_ctx, flags);
357 if (IS_ERR(op)) { 356 if (IS_ERR(op)) {
358 ret = PTR_ERR(op); 357 ret = PTR_ERR(op);
359 goto err_free_tdma; 358 goto err_free_tdma;
@@ -363,18 +362,18 @@ static int mv_cesa_ablkcipher_dma_req_init(struct ablkcipher_request *req,
363 mv_cesa_set_crypt_op_len(op, iter.base.op_len); 362 mv_cesa_set_crypt_op_len(op, iter.base.op_len);
364 363
365 /* Add input transfers */ 364 /* Add input transfers */
366 ret = mv_cesa_dma_add_op_transfers(&chain, &iter.base, 365 ret = mv_cesa_dma_add_op_transfers(&basereq->chain, &iter.base,
367 &iter.src, flags); 366 &iter.src, flags);
368 if (ret) 367 if (ret)
369 goto err_free_tdma; 368 goto err_free_tdma;
370 369
371 /* Add dummy desc to launch the crypto operation */ 370 /* Add dummy desc to launch the crypto operation */
372 ret = mv_cesa_dma_add_dummy_launch(&chain, flags); 371 ret = mv_cesa_dma_add_dummy_launch(&basereq->chain, flags);
373 if (ret) 372 if (ret)
374 goto err_free_tdma; 373 goto err_free_tdma;
375 374
376 /* Add output transfers */ 375 /* Add output transfers */
377 ret = mv_cesa_dma_add_op_transfers(&chain, &iter.base, 376 ret = mv_cesa_dma_add_op_transfers(&basereq->chain, &iter.base,
378 &iter.dst, flags); 377 &iter.dst, flags);
379 if (ret) 378 if (ret)
380 goto err_free_tdma; 379 goto err_free_tdma;
@@ -383,13 +382,12 @@ static int mv_cesa_ablkcipher_dma_req_init(struct ablkcipher_request *req,
383 382
384 /* Add output data for IV */ 383 /* Add output data for IV */
385 ivsize = crypto_ablkcipher_ivsize(crypto_ablkcipher_reqtfm(req)); 384 ivsize = crypto_ablkcipher_ivsize(crypto_ablkcipher_reqtfm(req));
386 ret = mv_cesa_dma_add_iv_op(&chain, CESA_SA_CRYPT_IV_SRAM_OFFSET, 385 ret = mv_cesa_dma_add_iv_op(&basereq->chain, CESA_SA_CRYPT_IV_SRAM_OFFSET,
387 ivsize, CESA_TDMA_SRC_IN_SRAM, flags); 386 ivsize, CESA_TDMA_SRC_IN_SRAM, flags);
388 387
389 if (ret) 388 if (ret)
390 goto err_free_tdma; 389 goto err_free_tdma;
391 390
392 basereq->chain = chain;
393 basereq->chain.last->flags |= CESA_TDMA_END_OF_REQ; 391 basereq->chain.last->flags |= CESA_TDMA_END_OF_REQ;
394 392
395 return 0; 393 return 0;