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:
parent
7aff7d0abc
commit
9cbe21d8f8
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user