diff options
| author | Liam <byteslice@airmail.cc> | 2023-06-18 22:21:29 -0400 | 
|---|---|---|
| committer | Liam <byteslice@airmail.cc> | 2023-06-18 22:21:29 -0400 | 
| commit | b0beca52a34bae1ac73731ab5a0a2504a471d23f (patch) | |
| tree | 8d47254c0a9dc6502234dfd50089933d1003c5f4 | |
| parent | ce191ba32bed6506878ebf2b01573e67aeee2938 (diff) | |
vfs_concat: fix offset calculation when not aligned to file boundary
| -rw-r--r-- | src/core/file_sys/vfs_concat.cpp | 9 | 
1 files changed, 5 insertions, 4 deletions
| diff --git a/src/core/file_sys/vfs_concat.cpp b/src/core/file_sys/vfs_concat.cpp index 853b893a1..5285467d2 100644 --- a/src/core/file_sys/vfs_concat.cpp +++ b/src/core/file_sys/vfs_concat.cpp @@ -150,18 +150,19 @@ std::size_t ConcatenatedVfsFile::Read(u8* data, std::size_t length, std::size_t      while (cur_length > 0 && it != concatenation_map.end()) {          // Check if we can read the file at this position.          const auto& file = it->file; -        const u64 file_offset = it->offset; +        const u64 map_offset = it->offset;          const u64 file_size = file->GetSize(); -        if (cur_offset >= file_offset + file_size) { +        if (cur_offset > map_offset + file_size) {              // Entirely out of bounds read.              break;          }          // Read the file at this position. -        const u64 intended_read_size = std::min<u64>(cur_length, file_size); +        const u64 file_seek = cur_offset - map_offset; +        const u64 intended_read_size = std::min<u64>(cur_length, file_size - file_seek);          const u64 actual_read_size = -            file->Read(data + (cur_offset - offset), intended_read_size, cur_offset - file_offset); +            file->Read(data + (cur_offset - offset), intended_read_size, file_seek);          // Update tracking.          cur_offset += actual_read_size; | 
