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:
Eelco Dolstra 2018-09-26 12:03:58 +02:00
parent 7ccdcc7fed
commit 44e86304b6
No known key found for this signature in database
GPG key ID: 8170B4726D7198DE
3 changed files with 5 additions and 4 deletions

View file

@ -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. */

View file

@ -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);

View file

@ -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);