* Print a better error message for wrong hashes (NIX-49).
This commit is contained in:
		
							parent
							
								
									22d13d6ec2
								
							
						
					
					
						commit
						0623359fbc
					
				
					 3 changed files with 16 additions and 4 deletions
				
			
		|  | @ -353,13 +353,16 @@ static Expr primDerivationStrict(EvalState & state, const ATermVector & args) | ||||||
|         HashType ht = parseHashType(outputHashAlgo); |         HashType ht = parseHashType(outputHashAlgo); | ||||||
|         if (ht == htUnknown) |         if (ht == htUnknown) | ||||||
|             throw EvalError(format("unknown hash algorithm `%1%'") % outputHashAlgo); |             throw EvalError(format("unknown hash algorithm `%1%'") % outputHashAlgo); | ||||||
|         Hash h; |         Hash h(ht); | ||||||
|         if (outputHash.size() == Hash(ht).hashSize * 2) |         if (outputHash.size() == h.hashSize * 2) | ||||||
|             /* hexadecimal representation */ |             /* hexadecimal representation */ | ||||||
|             h = parseHash(ht, outputHash); |             h = parseHash(ht, outputHash); | ||||||
|         else |         else if (outputHash.size() == hashLength32(h)) | ||||||
|             /* base-32 representation */ |             /* base-32 representation */ | ||||||
|             h = parseHash32(ht, outputHash); |             h = parseHash32(ht, outputHash); | ||||||
|  |         else | ||||||
|  |             throw Error(format("hash `%1%' has wrong length for hash type `%2%'") | ||||||
|  |                 % outputHash % outputHashAlgo); | ||||||
|         string s = outputHash; |         string s = outputHash; | ||||||
|         outputHash = printHash(h); |         outputHash = printHash(h); | ||||||
|         if (outputHashRecursive) outputHashAlgo = "r:" + outputHashAlgo; |         if (outputHashRecursive) outputHashAlgo = "r:" + outputHashAlgo; | ||||||
|  |  | ||||||
|  | @ -120,6 +120,12 @@ static unsigned char divMod(unsigned char * bytes, unsigned char y) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | unsigned int hashLength32(const Hash & hash) | ||||||
|  | { | ||||||
|  |     return (hash.hashSize * 8 - 1) / 5 + 1; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| // omitted: E O U T
 | // omitted: E O U T
 | ||||||
| const string base32Chars = "0123456789abcdfghijklmnpqrsvwxyz"; | const string base32Chars = "0123456789abcdfghijklmnpqrsvwxyz"; | ||||||
| 
 | 
 | ||||||
|  | @ -127,7 +133,7 @@ const string base32Chars = "0123456789abcdfghijklmnpqrsvwxyz"; | ||||||
| string printHash32(const Hash & hash) | string printHash32(const Hash & hash) | ||||||
| { | { | ||||||
|     Hash hash2(hash); |     Hash hash2(hash); | ||||||
|     unsigned int len = (hash.hashSize * 8 - 1) / 5 + 1; |     unsigned int len = hashLength32(hash); | ||||||
| 
 | 
 | ||||||
|     const char * chars = base32Chars.c_str(); |     const char * chars = base32Chars.c_str(); | ||||||
|      |      | ||||||
|  |  | ||||||
|  | @ -49,6 +49,9 @@ string printHash(const Hash & hash); | ||||||
| /* Parse a hexadecimal representation of a hash code. */ | /* Parse a hexadecimal representation of a hash code. */ | ||||||
| Hash parseHash(HashType ht, const string & s); | Hash parseHash(HashType ht, const string & s); | ||||||
| 
 | 
 | ||||||
|  | /* Returns the length of a base-32 hash representation. */ | ||||||
|  | unsigned int hashLength32(const Hash & hash); | ||||||
|  | 
 | ||||||
| /* Convert a hash to a base-32 representation. */ | /* Convert a hash to a base-32 representation. */ | ||||||
| string printHash32(const Hash & hash); | string printHash32(const Hash & hash); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue