Skip to content

Commit a569cc1

Browse files
committed
Bug fix when PE resources contain an infinite recursion loop
1 parent abd104e commit a569cc1

File tree

2 files changed

+7
-1
lines changed

2 files changed

+7
-1
lines changed

include/LIEF/PE/Parser.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ class DLL_PUBLIC Parser : public LIEF::Parser {
9393
std::unique_ptr<VectorStream> stream_;
9494
Binary* binary_;
9595
PE_TYPE type_;
96+
std::set<uint32_t> resource_visited_;
9697
};
9798

9899

src/PE/Parser.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -273,8 +273,13 @@ ResourceNode* Parser::build_resource_node(
273273
uint32_t rvaToDirectory = rvaToData & (~ 0x80000000);
274274
uint32_t offset = baseOffset + rvaToDirectory;
275275
try {
276-
const auto* nextDirectoryTable = reinterpret_cast<const pe_resource_directory_table*>(
276+
const pe_resource_directory_table* nextDirectoryTable = reinterpret_cast<const pe_resource_directory_table*>(
277277
this->stream_->read(offset, sizeof(pe_resource_directory_table)));
278+
if (this->resource_visited_.count(offset) > 0) {
279+
LOG(WARNING) << "Infinite loop detected on resources";
280+
break;
281+
}
282+
this->resource_visited_.insert(offset);
278283

279284
ResourceNode* node = this->build_resource_node(nextDirectoryTable, baseOffset);
280285
node->id_ = id;

0 commit comments

Comments
 (0)