]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blobdiff - lib/mpi/mpicoder.c
lib/mpi: kunmap after finishing accessing buffer
[mirror_ubuntu-artful-kernel.git] / lib / mpi / mpicoder.c
index c6272ae2015e706634e04eef16af75eca0f95091..eead4b339466854f51db30a17f17ee0472ebe6d3 100644 (file)
@@ -363,9 +363,12 @@ MPI mpi_read_raw_from_sgl(struct scatterlist *sgl, unsigned int nbytes)
                lzeros = 0;
        }
 
+       miter.consumed = lzeros;
+
        nbytes -= lzeros;
        nbits = nbytes * 8;
        if (nbits > MAX_EXTERN_MPI_BITS) {
+               sg_miter_stop(&miter);
                pr_info("MPI: mpi too large (%u bits)\n", nbits);
                return NULL;
        }
@@ -373,6 +376,8 @@ MPI mpi_read_raw_from_sgl(struct scatterlist *sgl, unsigned int nbytes)
        if (nbytes > 0)
                nbits -= count_leading_zeros(*buff) - (BITS_PER_LONG - 8);
 
+       sg_miter_stop(&miter);
+
        nlimbs = DIV_ROUND_UP(nbytes, BYTES_PER_MPI_LIMB);
        val = mpi_alloc(nlimbs);
        if (!val)
@@ -390,7 +395,10 @@ MPI mpi_read_raw_from_sgl(struct scatterlist *sgl, unsigned int nbytes)
        z = BYTES_PER_MPI_LIMB - nbytes % BYTES_PER_MPI_LIMB;
        z %= BYTES_PER_MPI_LIMB;
 
-       for (;;) {
+       while (sg_miter_next(&miter)) {
+               buff = miter.addr;
+               len = miter.length;
+
                for (x = 0; x < len; x++) {
                        a <<= 8;
                        a |= *buff++;
@@ -400,12 +408,6 @@ MPI mpi_read_raw_from_sgl(struct scatterlist *sgl, unsigned int nbytes)
                        }
                }
                z += x;
-
-               if (!sg_miter_next(&miter))
-                       break;
-
-               buff = miter.addr;
-               len = miter.length;
        }
 
        return val;