forked from mirrors/linux
		
	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
					
				
					 1 changed files with 17 additions and 4 deletions
				
			
		|  | @ -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 a new issue
	
	 Andrzej Zaborowski
						Andrzej Zaborowski