Merge pull request #10841 from liamwhite/math-is-hard

vfs_concat: fix offset calculation when not aligned to file boundary
This commit is contained in:
bunnei 2023-06-21 21:07:08 -07:00 committed by GitHub
commit 8cb6b33809
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -150,23 +150,29 @@ std::size_t ConcatenatedVfsFile::Read(u8* data, std::size_t length, std::size_t
while (cur_length > 0 && it != concatenation_map.end()) { while (cur_length > 0 && it != concatenation_map.end()) {
// Check if we can read the file at this position. // Check if we can read the file at this position.
const auto& file = it->file; const auto& file = it->file;
const u64 file_offset = it->offset; const u64 map_offset = it->offset;
const u64 file_size = file->GetSize(); 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. // Entirely out of bounds read.
break; break;
} }
// Read the file at this position. // 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 = 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. // Update tracking.
cur_offset += actual_read_size; cur_offset += actual_read_size;
cur_length -= actual_read_size; cur_length -= actual_read_size;
it++; it++;
// If we encountered a short read, we're done.
if (actual_read_size < intended_read_size) {
break;
}
} }
return cur_offset - offset; return cur_offset - offset;