Browse Source

Fix OOM bug: UTXO entries with invalid script length

0.13
Pieter Wuille 9 years ago
parent
commit
5d0434d13d
  1. 6
      src/compressor.h
  2. 14
      src/streams.h

6
src/compressor.h

@ -86,9 +86,15 @@ public:
return; return;
} }
nSize -= nSpecialScripts; nSize -= nSpecialScripts;
if (nSize > MAX_SCRIPT_SIZE) {
// Overly long script, replace with a short invalid one
script << OP_RETURN;
s.ignore(nSize);
} else {
script.resize(nSize); script.resize(nSize);
s >> REF(CFlatData(script)); s >> REF(CFlatData(script));
} }
}
}; };
/** wrapper for CTxOut that provides a more compact serialization */ /** wrapper for CTxOut that provides a more compact serialization */

14
src/streams.h

@ -406,6 +406,20 @@ public:
return (*this); return (*this);
} }
CAutoFile& ignore(size_t nSize)
{
if (!file)
throw std::ios_base::failure("CAutoFile::ignore: file handle is NULL");
unsigned char data[4096];
while (nSize > 0) {
size_t nNow = std::min<size_t>(nSize, sizeof(data));
if (fread(data, 1, nNow, file) != nNow)
throw std::ios_base::failure(feof(file) ? "CAutoFile::ignore: end of file" : "CAutoFile::read: fread failed");
nSize -= nNow;
}
return (*this);
}
CAutoFile& write(const char* pch, size_t nSize) CAutoFile& write(const char* pch, size_t nSize)
{ {
if (!file) if (!file)

Loading…
Cancel
Save