lib/mpi: only require buffers as big as needed for the integer
authorAndrzej Zaborowski <andrew.zaborowski@intel.com>
Fri, 13 Nov 2015 11:01:32 +0000 (12:01 +0100)
committerHerbert Xu <herbert@gondor.apana.org.au>
Tue, 17 Nov 2015 14:00:39 +0000 (22:00 +0800)
Since mpi_write_to_sgl and mpi_read_buffer explicitly left-align the
integers being written it makes no sense to require a buffer big enough for
the number + the leading zero bytes which are not written.  The error
returned also doesn't convey any information.  So instead require only the
size needed and return -EOVERFLOW to signal when buffer too short.

Signed-off-by: Andrew Zaborowski <andrew.zaborowski@intel.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
lib/mpi/mpicoder.c

index 3db76b8c11158f5ce2b3884898e3d2abfbd6d91a..ec533a6c77b5bd71792435a6ab6b4bea9c6b3d8c 100644 (file)
@@ -135,7 +135,9 @@ EXPORT_SYMBOL_GPL(mpi_read_from_buffer);
  * @buf:       bufer to which the output will be written to. Needs to be at
  *             leaset mpi_get_size(a) long.
  * @buf_len:   size of the buf.
- * @nbytes:    receives the actual length of the data written.
+ * @nbytes:    receives the actual length of the data written on success and
+ *             the data to-be-written on -EOVERFLOW in case buf_len was too
+ *             small.
  * @sign:      if not NULL, it will be set to the sign of a.
  *
  * Return:     0 on success or error code in case of error
@@ -148,7 +150,7 @@ int mpi_read_buffer(MPI a, uint8_t *buf, unsigned buf_len, unsigned *nbytes,
        unsigned int n = mpi_get_size(a);
        int i, lzeros = 0;
 
-       if (buf_len < n || !buf || !nbytes)
+       if (!buf || !nbytes)
                return -EINVAL;
 
        if (sign)
@@ -163,6 +165,11 @@ int mpi_read_buffer(MPI a, uint8_t *buf, unsigned buf_len, unsigned *nbytes,
                        break;
        }
 
+       if (buf_len < n - lzeros) {
+               *nbytes = n - lzeros;
+               return -EOVERFLOW;
+       }
+
        p = buf;
        *nbytes = n - lzeros;
 
@@ -332,7 +339,8 @@ EXPORT_SYMBOL_GPL(mpi_set_buffer);
  * @nbytes:    in/out param - it has the be set to the maximum number of
  *             bytes that can be written to sgl. This has to be at least
  *             the size of the integer a. On return it receives the actual
- *             length of the data written.
+ *             length of the data written on success or the data that would
+ *             be written if buffer was too small.
  * @sign:      if not NULL, it will be set to the sign of a.
  *
  * Return:     0 on success or error code in case of error
@@ -345,7 +353,7 @@ int mpi_write_to_sgl(MPI a, struct scatterlist *sgl, unsigned *nbytes,
        unsigned int n = mpi_get_size(a);
        int i, x, y = 0, lzeros = 0, buf_len;
 
-       if (!nbytes || *nbytes < n)
+       if (!nbytes)
                return -EINVAL;
 
        if (sign)
@@ -360,6 +368,11 @@ int mpi_write_to_sgl(MPI a, struct scatterlist *sgl, unsigned *nbytes,
                        break;
        }
 
+       if (*nbytes < n - lzeros) {
+               *nbytes = n - lzeros;
+               return -EOVERFLOW;
+       }
+
        *nbytes = n - lzeros;
        buf_len = sgl->length;
        p2 = sg_virt(sgl);