diff options
author | Herbert Xu <herbert@gondor.apana.org.au> | 2016-07-28 01:29:17 -0400 |
---|---|---|
committer | Herbert Xu <herbert@gondor.apana.org.au> | 2016-07-29 06:30:16 -0400 |
commit | 4816c9406430d0d3d4fa58a212a7a869d429b315 (patch) | |
tree | 06eee2ccd96dbdcd86c8f0c4f700386d3f160985 /lib/mpi/mpicoder.c | |
parent | 64ec6ccb76e6ef13c40ad68e125545f8807a26c8 (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.c | 14 |
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; |