mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2026-08-26 20:58:28 -05:00
NANDImporter: Abort extraction if a NAND FST entry is visited more than once
This commit is contained in:
@@ -129,7 +129,8 @@ bool NANDImporter::ExtractFiles()
|
||||
constexpr u16 CLUSTER_CHAIN_END = 0xFFFB;
|
||||
m_progress_cur = 0;
|
||||
m_progress_max = std::ranges::count(m_superblock->fat, CLUSTER_CHAIN_END);
|
||||
return ProcessEntry(0, "");
|
||||
std::bitset<FSTEntryCount> visited;
|
||||
return ProcessEntry(0, "", &visited);
|
||||
}
|
||||
|
||||
std::string NANDImporter::GetPath(const NANDFSTEntry& entry, const std::string& parent_path)
|
||||
@@ -138,7 +139,8 @@ std::string NANDImporter::GetPath(const NANDFSTEntry& entry, const std::string&
|
||||
return parent_path + '/' + Common::EscapeFileName(name);
|
||||
}
|
||||
|
||||
bool NANDImporter::ProcessEntry(u16 entry_number, const std::string& parent_path)
|
||||
bool NANDImporter::ProcessEntry(u16 entry_number, const std::string& parent_path,
|
||||
std::bitset<FSTEntryCount>* visited)
|
||||
{
|
||||
while (entry_number != 0xffff)
|
||||
{
|
||||
@@ -148,6 +150,13 @@ bool NANDImporter::ProcessEntry(u16 entry_number, const std::string& parent_path
|
||||
return false;
|
||||
}
|
||||
|
||||
if ((*visited)[entry_number])
|
||||
{
|
||||
ERROR_LOG_FMT(DISCIO, "FST entry number {} visited multiple times", entry_number);
|
||||
return false;
|
||||
}
|
||||
|
||||
(*visited)[entry_number] = true;
|
||||
const NANDFSTEntry entry = m_superblock->fst[entry_number];
|
||||
|
||||
const std::string path = entry_number == 0 ? parent_path : GetPath(entry, parent_path);
|
||||
@@ -165,7 +174,7 @@ bool NANDImporter::ProcessEntry(u16 entry_number, const std::string& parent_path
|
||||
else if (type == Type::Directory)
|
||||
{
|
||||
File::CreateDir(m_nand_root + path);
|
||||
if (!ProcessEntry(entry.sub, path))
|
||||
if (!ProcessEntry(entry.sub, path, visited))
|
||||
return false;
|
||||
}
|
||||
else
|
||||
|
||||
Reference in New Issue
Block a user