From 2a4ca1a1b73ed0578a7a27b4f81ff5e7eb95cc23 Mon Sep 17 00:00:00 2001 From: Gliniak Date: Sat, 3 May 2025 20:58:14 +0200 Subject: [PATCH] [VFS] Added fallback if conversion of 1252->UTF8 fails --- src/xenia/vfs/devices/disc_image_device.cc | 5 +++++ .../xcontent_devices/stfs_container_device.cc | 5 +++++ .../xcontent_devices/svod_container_device.cc | 16 +++++++++++++--- 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/src/xenia/vfs/devices/disc_image_device.cc b/src/xenia/vfs/devices/disc_image_device.cc index 121850fa3..123d5a262 100644 --- a/src/xenia/vfs/devices/disc_image_device.cc +++ b/src/xenia/vfs/devices/disc_image_device.cc @@ -144,6 +144,11 @@ bool DiscImageDevice::ReadEntry(ParseState* state, const uint8_t* buffer, // Filename is stored as Windows-1252, convert it to UTF-8. auto ansi_name = std::string(name_buffer, name_length); auto name = xe::win1252_to_utf8(ansi_name); + // Fallback to normal name if for whatever reason conversion from 1252 code + // page failed. + if (name.empty()) { + name = ansi_name; + } auto entry = DiscImageEntry::Create(this, parent, name, mmap_.get()); entry->attributes_ = attributes | kFileAttributeReadOnly; diff --git a/src/xenia/vfs/devices/xcontent_devices/stfs_container_device.cc b/src/xenia/vfs/devices/xcontent_devices/stfs_container_device.cc index 1d9e05039..7273a7b4d 100644 --- a/src/xenia/vfs/devices/xcontent_devices/stfs_container_device.cc +++ b/src/xenia/vfs/devices/xcontent_devices/stfs_container_device.cc @@ -117,6 +117,11 @@ std::unique_ptr StfsContainerDevice::ReadEntry( std::string ansi_name(reinterpret_cast(dir_entry->name), dir_entry->flags.name_length & 0x3F); std::string name = xe::win1252_to_utf8(ansi_name); + // Fallback to normal name if for whatever reason conversion from 1252 code + // page failed. + if (name.empty()) { + name = ansi_name; + } auto entry = XContentContainerEntry::Create(this, parent, name, &files_); diff --git a/src/xenia/vfs/devices/xcontent_devices/svod_container_device.cc b/src/xenia/vfs/devices/xcontent_devices/svod_container_device.cc index e32c87a85..bf88cd31f 100644 --- a/src/xenia/vfs/devices/xcontent_devices/svod_container_device.cc +++ b/src/xenia/vfs/devices/xcontent_devices/svod_container_device.cc @@ -126,7 +126,11 @@ SvodContainerDevice::Result SvodContainerDevice::ReadEntry( // Read directory entry auto& file = files_.at(entry_file); - xe::filesystem::Seek(file, entry_address, SEEK_SET); + if (!xe::filesystem::Seek(file, entry_address, SEEK_SET)) { + XELOGE("{} Failed: Cannot seek file {} with offset: {} ordinal: {}", + __func__, entry_file, entry_address, ordinal); + return Result::kReadError; + } #pragma pack(push, 1) struct { @@ -141,7 +145,7 @@ SvodContainerDevice::Result SvodContainerDevice::ReadEntry( #pragma pack(pop) if (fread(&dir_entry, sizeof(dir_entry), 1, file) != 1) { - XELOGE("ReadEntrySVOD failed to read directory entry at 0x{X}", + XELOGE("ReadEntrySVOD failed to read directory entry at {:016X}", entry_address); return Result::kReadError; } @@ -149,7 +153,7 @@ SvodContainerDevice::Result SvodContainerDevice::ReadEntry( auto name_buffer = std::make_unique(dir_entry.name_length); if (fread(name_buffer.get(), 1, dir_entry.name_length, file) != dir_entry.name_length) { - XELOGE("ReadEntrySVOD failed to read directory entry name at 0x{X}", + XELOGE("ReadEntrySVOD failed to read directory entry name at {:016X}", entry_address); return Result::kReadError; } @@ -158,6 +162,12 @@ SvodContainerDevice::Result SvodContainerDevice::ReadEntry( auto ansi_name = std::string(name_buffer.get(), dir_entry.name_length); auto name = xe::win1252_to_utf8(ansi_name); + // Fallback to normal name if for whatever reason conversion from 1252 code + // page failed. + if (name.empty()) { + name = ansi_name; + } + // Read the left node if (dir_entry.node_l) { auto node_result = ReadEntry(block, dir_entry.node_l, parent);