Make NAR header check more robust
Changes std::bad_alloc into bad archive: input doesn't look like a Nix archive
This commit is contained in:
		
							parent
							
								
									7ccdcc7fed
								
							
						
					
					
						commit
						44e86304b6
					
				
					 3 changed files with 5 additions and 4 deletions
				
			
		| 
						 | 
					@ -283,7 +283,7 @@ void parseDump(ParseSink & sink, Source & source)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    string version;
 | 
					    string version;
 | 
				
			||||||
    try {
 | 
					    try {
 | 
				
			||||||
        version = readString(source);
 | 
					        version = readString(source, narVersionMagic1.size());
 | 
				
			||||||
    } catch (SerialisationError & e) {
 | 
					    } catch (SerialisationError & e) {
 | 
				
			||||||
        /* This generally means the integer at the start couldn't be
 | 
					        /* This generally means the integer at the start couldn't be
 | 
				
			||||||
           decoded.  Ignore and throw the exception below. */
 | 
					           decoded.  Ignore and throw the exception below. */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -268,16 +268,17 @@ void readPadding(size_t len, Source & source)
 | 
				
			||||||
size_t readString(unsigned char * buf, size_t max, Source & source)
 | 
					size_t readString(unsigned char * buf, size_t max, Source & source)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    auto len = readNum<size_t>(source);
 | 
					    auto len = readNum<size_t>(source);
 | 
				
			||||||
    if (len > max) throw Error("string is too long");
 | 
					    if (len > max) throw SerialisationError("string is too long");
 | 
				
			||||||
    source(buf, len);
 | 
					    source(buf, len);
 | 
				
			||||||
    readPadding(len, source);
 | 
					    readPadding(len, source);
 | 
				
			||||||
    return len;
 | 
					    return len;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
string readString(Source & source)
 | 
					string readString(Source & source, size_t max)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    auto len = readNum<size_t>(source);
 | 
					    auto len = readNum<size_t>(source);
 | 
				
			||||||
 | 
					    if (len > max) throw SerialisationError("string is too long");
 | 
				
			||||||
    std::string res(len, 0);
 | 
					    std::string res(len, 0);
 | 
				
			||||||
    source((unsigned char*) res.data(), len);
 | 
					    source((unsigned char*) res.data(), len);
 | 
				
			||||||
    readPadding(len, source);
 | 
					    readPadding(len, source);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -284,7 +284,7 @@ inline uint64_t readLongLong(Source & source)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void readPadding(size_t len, Source & source);
 | 
					void readPadding(size_t len, Source & source);
 | 
				
			||||||
size_t readString(unsigned char * buf, size_t max, Source & source);
 | 
					size_t readString(unsigned char * buf, size_t max, Source & source);
 | 
				
			||||||
string readString(Source & source);
 | 
					string readString(Source & source, size_t max = std::numeric_limits<size_t>::max());
 | 
				
			||||||
template<class T> T readStrings(Source & source);
 | 
					template<class T> T readStrings(Source & source);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Source & operator >> (Source & in, string & s);
 | 
					Source & operator >> (Source & in, string & s);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue