2
0
mirror of https://github.com/edk2-porting/linux-next.git synced 2024-12-17 17:53:56 +08:00

lib/mpi: only require buffers as big as needed for the integer

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>
This commit is contained in:
Andrzej Zaborowski 2015-11-13 12:01:32 +01:00 committed by Herbert Xu
parent 7aff7d0abc
commit 9cbe21d8f8

View 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 * @buf: bufer to which the output will be written to. Needs to be at
* leaset mpi_get_size(a) long. * leaset mpi_get_size(a) long.
* @buf_len: size of the buf. * @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. * @sign: if not NULL, it will be set to the sign of a.
* *
* Return: 0 on success or error code in case of error * 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); unsigned int n = mpi_get_size(a);
int i, lzeros = 0; int i, lzeros = 0;
if (buf_len < n || !buf || !nbytes) if (!buf || !nbytes)
return -EINVAL; return -EINVAL;
if (sign) if (sign)
@ -163,6 +165,11 @@ int mpi_read_buffer(MPI a, uint8_t *buf, unsigned buf_len, unsigned *nbytes,
break; break;
} }
if (buf_len < n - lzeros) {
*nbytes = n - lzeros;
return -EOVERFLOW;
}
p = buf; p = buf;
*nbytes = n - lzeros; *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 * @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 * 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 * 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. * @sign: if not NULL, it will be set to the sign of a.
* *
* Return: 0 on success or error code in case of error * 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); unsigned int n = mpi_get_size(a);
int i, x, y = 0, lzeros = 0, buf_len; int i, x, y = 0, lzeros = 0, buf_len;
if (!nbytes || *nbytes < n) if (!nbytes)
return -EINVAL; return -EINVAL;
if (sign) if (sign)
@ -360,6 +368,11 @@ int mpi_write_to_sgl(MPI a, struct scatterlist *sgl, unsigned *nbytes,
break; break;
} }
if (*nbytes < n - lzeros) {
*nbytes = n - lzeros;
return -EOVERFLOW;
}
*nbytes = n - lzeros; *nbytes = n - lzeros;
buf_len = sgl->length; buf_len = sgl->length;
p2 = sg_virt(sgl); p2 = sg_virt(sgl);