forked from mirrors/linux
		
	MPI: Fix mpi_read_buffer
Change mpi_read_buffer to return a number without leading zeros so that mpi_read_buffer and mpi_get_buffer return the same thing. Signed-off-by: Tadeusz Struk <tadeusz.struk@intel.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
This commit is contained in:
		
							parent
							
								
									55e8dba1ac
								
							
						
					
					
						commit
						0f74fbf77d
					
				
					 1 changed files with 25 additions and 13 deletions
				
			
		|  | @ -146,18 +146,25 @@ int mpi_read_buffer(MPI a, uint8_t *buf, unsigned buf_len, unsigned *nbytes, | |||
| 	uint8_t *p; | ||||
| 	mpi_limb_t alimb; | ||||
| 	unsigned int n = mpi_get_size(a); | ||||
| 	int i; | ||||
| 	int i, lzeros = 0; | ||||
| 
 | ||||
| 	if (buf_len < n || !buf) | ||||
| 	if (buf_len < n || !buf || !nbytes) | ||||
| 		return -EINVAL; | ||||
| 
 | ||||
| 	if (sign) | ||||
| 		*sign = a->sign; | ||||
| 
 | ||||
| 	if (nbytes) | ||||
| 		*nbytes = n; | ||||
| 	p = (void *)&a->d[a->nlimbs] - 1; | ||||
| 
 | ||||
| 	for (i = a->nlimbs * sizeof(alimb) - 1; i >= 0; i--, p--) { | ||||
| 		if (!*p) | ||||
| 			lzeros++; | ||||
| 		else | ||||
| 			break; | ||||
| 	} | ||||
| 
 | ||||
| 	p = buf; | ||||
| 	*nbytes = n - lzeros; | ||||
| 
 | ||||
| 	for (i = a->nlimbs - 1; i >= 0; i--) { | ||||
| 		alimb = a->d[i]; | ||||
|  | @ -178,6 +185,19 @@ int mpi_read_buffer(MPI a, uint8_t *buf, unsigned buf_len, unsigned *nbytes, | |||
| #else | ||||
| #error please implement for this limb size. | ||||
| #endif | ||||
| 
 | ||||
| 		if (lzeros > 0) { | ||||
| 			if (lzeros >= sizeof(alimb)) { | ||||
| 				p -= sizeof(alimb); | ||||
| 			} else { | ||||
| 				mpi_limb_t *limb1 = (void *)p - sizeof(alimb); | ||||
| 				mpi_limb_t *limb2 = (void *)p - sizeof(alimb) | ||||
| 							+ lzeros; | ||||
| 				*limb1 = *limb2; | ||||
| 				p -= lzeros; | ||||
| 			} | ||||
| 			lzeros -= sizeof(alimb); | ||||
| 		} | ||||
| 	} | ||||
| 	return 0; | ||||
| } | ||||
|  | @ -197,7 +217,7 @@ EXPORT_SYMBOL_GPL(mpi_read_buffer); | |||
|  */ | ||||
| void *mpi_get_buffer(MPI a, unsigned *nbytes, int *sign) | ||||
| { | ||||
| 	uint8_t *buf, *p; | ||||
| 	uint8_t *buf; | ||||
| 	unsigned int n; | ||||
| 	int ret; | ||||
| 
 | ||||
|  | @ -220,14 +240,6 @@ void *mpi_get_buffer(MPI a, unsigned *nbytes, int *sign) | |||
| 		kfree(buf); | ||||
| 		return NULL; | ||||
| 	} | ||||
| 
 | ||||
| 	/* this is sub-optimal but we need to do the shift operation
 | ||||
| 	 * because the caller has to free the returned buffer */ | ||||
| 	for (p = buf; !*p && *nbytes; p++, --*nbytes) | ||||
| 		; | ||||
| 	if (p != buf) | ||||
| 		memmove(buf, p, *nbytes); | ||||
| 
 | ||||
| 	return buf; | ||||
| } | ||||
| EXPORT_SYMBOL_GPL(mpi_get_buffer); | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Tadeusz Struk
						Tadeusz Struk