Skip to content

Commit d6f623b

Browse files
authored
Merge pull request #125 from OpenFodder/codex/fix-unsafe-rnc-decompression-vulnerability
Harden loose-resource RNC decompression checks
2 parents e412180 + 99846e2 commit d6f623b

1 file changed

Lines changed: 15 additions & 1 deletion

File tree

Source/Resources.cpp

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,15 +38,29 @@ tSharedBuffer cResources::fileGet( std::string pFilename ) {
3838
}
3939

4040
tSharedBuffer cResources::fileDeRNC(tSharedBuffer pBuffer) {
41+
constexpr uint32 RNCHeaderSize = 18;
42+
constexpr uint32 MaxUnpackedSize = 64 * 1024 * 1024;
43+
44+
if (pBuffer->size() < RNCHeaderSize)
45+
return pBuffer;
46+
4147
uint32 Header = readBEDWord(pBuffer->data());
4248
if (Header != 'RNC\01')
4349
return pBuffer;
4450

4551
uint32 Size = readBEDWord(pBuffer->data() + 4);
52+
uint32 PackedSize = readBEDWord(pBuffer->data() + 8);
53+
54+
if ((PackedSize > (pBuffer->size() - RNCHeaderSize)) || !Size || (Size > MaxUnpackedSize))
55+
return pBuffer;
4656

4757
auto Unpacked = std::make_shared<std::vector<uint8>>();
4858
Unpacked->resize(Size);
49-
rnc_unpack(pBuffer->data(), Unpacked->data());
59+
60+
long Result = rnc_unpack(pBuffer->data(), Unpacked->data());
61+
if (Result != static_cast<long>(Size))
62+
return pBuffer;
63+
5064
return Unpacked;
5165
}
5266

0 commit comments

Comments
 (0)