aboutsummaryrefslogtreecommitdiffstats
path: root/lib/mpi/mpicoder.c
diff options
context:
space:
mode:
authorHerbert Xu <herbert@gondor.apana.org.au>2016-07-28 01:29:17 -0400
committerHerbert Xu <herbert@gondor.apana.org.au>2016-07-29 06:30:16 -0400
commit4816c9406430d0d3d4fa58a212a7a869d429b315 (patch)
tree06eee2ccd96dbdcd86c8f0c4f700386d3f160985 /lib/mpi/mpicoder.c
parent64ec6ccb76e6ef13c40ad68e125545f8807a26c8 (diff)
lib/mpi: Fix SG miter leak
In mpi_read_raw_from_sgl we may leak the SG miter resouces after reading the leading zeroes. This patch fixes this by stopping the iteration once the leading zeroes have been read. Fixes: 127827b9c295 ("lib/mpi: Do not do sg_virt") Reported-by: Nicolai Stange <nicstange@gmail.com> Tested-by: Nicolai Stange <nicstange@gmail.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Diffstat (limited to 'lib/mpi/mpicoder.c')
-rw-r--r--lib/mpi/mpicoder.c14
1 files changed, 7 insertions, 7 deletions
diff --git a/lib/mpi/mpicoder.c b/lib/mpi/mpicoder.c
index c6272ae2015e..5a0f75a3bf01 100644
--- a/lib/mpi/mpicoder.c
+++ b/lib/mpi/mpicoder.c
@@ -363,6 +363,9 @@ MPI mpi_read_raw_from_sgl(struct scatterlist *sgl, unsigned int nbytes)
363 lzeros = 0; 363 lzeros = 0;
364 } 364 }
365 365
366 miter.consumed = lzeros;
367 sg_miter_stop(&miter);
368
366 nbytes -= lzeros; 369 nbytes -= lzeros;
367 nbits = nbytes * 8; 370 nbits = nbytes * 8;
368 if (nbits > MAX_EXTERN_MPI_BITS) { 371 if (nbits > MAX_EXTERN_MPI_BITS) {
@@ -390,7 +393,10 @@ MPI mpi_read_raw_from_sgl(struct scatterlist *sgl, unsigned int nbytes)
390 z = BYTES_PER_MPI_LIMB - nbytes % BYTES_PER_MPI_LIMB; 393 z = BYTES_PER_MPI_LIMB - nbytes % BYTES_PER_MPI_LIMB;
391 z %= BYTES_PER_MPI_LIMB; 394 z %= BYTES_PER_MPI_LIMB;
392 395
393 for (;;) { 396 while (sg_miter_next(&miter)) {
397 buff = miter.addr;
398 len = miter.length;
399
394 for (x = 0; x < len; x++) { 400 for (x = 0; x < len; x++) {
395 a <<= 8; 401 a <<= 8;
396 a |= *buff++; 402 a |= *buff++;
@@ -400,12 +406,6 @@ MPI mpi_read_raw_from_sgl(struct scatterlist *sgl, unsigned int nbytes)
400 } 406 }
401 } 407 }
402 z += x; 408 z += x;
403
404 if (!sg_miter_next(&miter))
405 break;
406
407 buff = miter.addr;
408 len = miter.length;
409 } 409 }
410 410
411 return val; 411 return val;