diff options
Diffstat (limited to 'lib/mpi/mpicoder.c')
| -rw-r--r-- | lib/mpi/mpicoder.c | 21 | 
1 files changed, 17 insertions, 4 deletions
| diff --git a/lib/mpi/mpicoder.c b/lib/mpi/mpicoder.c index 3db76b8c1115..ec533a6c77b5 100644 --- a/lib/mpi/mpicoder.c +++ b/lib/mpi/mpicoder.c @@ -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); | 
