summaryrefslogtreecommitdiff
path: root/Source/Core/DiscIO/VolumeDirectory.cpp
diff options
context:
space:
mode:
authorDwayne Slater <ds84182@gmail.com>2017-03-13 13:18:51 -0400
committerDwayne Slater <ds84182@gmail.com>2017-04-15 13:52:46 -0400
commit790830278249c5059d3fef92ea5dfa707de8a0bd (patch)
tree9500317d775a7b8ae1fe738452316f064ec922c8 /Source/Core/DiscIO/VolumeDirectory.cpp
parenta389ae0711142d8c5c996fda3d1e6c5731d71de3 (diff)
VolumeDirectory: Fix off-by-one in entry count calculation
The size field in FSTEntry contains the total amount of children, not including the parent, but the parent needs to be included. VolumeDirectory: Fix off-by-one in entry count calculation The size field in FSTEntry contains the total amount of children, not including the parent, but the parent needs to be included.
Diffstat (limited to 'Source/Core/DiscIO/VolumeDirectory.cpp')
-rw-r--r--Source/Core/DiscIO/VolumeDirectory.cpp8
1 files changed, 3 insertions, 5 deletions
diff --git a/Source/Core/DiscIO/VolumeDirectory.cpp b/Source/Core/DiscIO/VolumeDirectory.cpp
index 8668b2b936..7f552e4195 100644
--- a/Source/Core/DiscIO/VolumeDirectory.cpp
+++ b/Source/Core/DiscIO/VolumeDirectory.cpp
@@ -351,8 +351,9 @@ void CVolumeDirectory::BuildFST()
File::FSTEntry rootEntry = File::ScanDirectoryTree(m_root_directory, true);
u32 name_table_size = ComputeNameSize(rootEntry);
+ u64 total_entries = rootEntry.size + 1; // The root entry itself isn't counted in rootEntry.size
- m_fst_name_offset = rootEntry.size * ENTRY_SIZE; // offset of name table in FST
+ m_fst_name_offset = total_entries * ENTRY_SIZE; // offset of name table in FST
m_fst_data.resize(m_fst_name_offset + name_table_size);
// if FST hasn't been assigned (ie no apploader/dol setup), set to default
@@ -368,7 +369,7 @@ void CVolumeDirectory::BuildFST()
u32 root_offset = 0; // Offset of root of FST
// write root entry
- WriteEntryData(&fst_offset, DIRECTORY_ENTRY, 0, 0, rootEntry.size);
+ WriteEntryData(&fst_offset, DIRECTORY_ENTRY, 0, 0, total_entries);
WriteDirectory(rootEntry, &fst_offset, &name_offset, &current_data_address, root_offset);
@@ -454,9 +455,6 @@ void CVolumeDirectory::WriteDirectory(const File::FSTEntry& parent_entry, u32* f
// Sort for determinism
std::sort(sorted_entries.begin(), sorted_entries.end(), [](const File::FSTEntry& one,
const File::FSTEntry& two) {
- // For some reason, sorting by lowest ASCII value first prevents many games from
- // fully booting. We make the comparison case insensitive to solve the problem.
- // (Highest ASCII value first seems to work regardless of case sensitivity.)
const std::string one_lower = ASCIIToLowercase(one.virtualName);
const std::string two_lower = ASCIIToLowercase(two.virtualName);
return one_lower == two_lower ? one.virtualName < two.virtualName : one_lower < two_lower;