From 7b60c6385c41fe255ea793a4b0e2a89c31ef330c Mon Sep 17 00:00:00 2001 From: digant73 Date: Sat, 9 May 2026 14:21:46 +0200 Subject: [PATCH] Fix missing read of remaining chunk of data on next extent, if present --- rpcs3/Loader/ISO.cpp | 41 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 39 insertions(+), 2 deletions(-) diff --git a/rpcs3/Loader/ISO.cpp b/rpcs3/Loader/ISO.cpp index cfd83863ef..45fbcbaaab 100644 --- a/rpcs3/Loader/ISO.cpp +++ b/rpcs3/Loader/ISO.cpp @@ -623,13 +623,14 @@ u64 iso_file_encrypted::read_at(u64 offset, void* buffer, u64 size) // ' ' ' ' // | first sec | inner sec(s) | last sec | - const u64 max_size = std::min(size, local_extent_remaining(offset)); + u64 max_size = std::min(size, local_extent_remaining(offset)); if (max_size == 0) { return 0; } + const u64 total_size = this->size(); const u64 archive_first_offset = file_offset(offset); const u64 archive_last_offset = archive_first_offset + max_size - 1; iso_sector first_sec, last_sec; @@ -682,6 +683,13 @@ u64 iso_file_encrypted::read_at(u64 offset, void* buffer, u64 size) return 0; } + // If present, read the remaining chunk of data on next extent + if (size > max_size && (offset + max_size) < total_size) + { + iso_log.warning("read_at: %s: Extent limit reached reading from file (%llu/%llu)", m_meta.name, max_size, size); + max_size += read_at(offset + max_size, &reinterpret_cast(buffer)[max_size], size - max_size); + } + return max_size; } @@ -745,6 +753,13 @@ u64 iso_file_encrypted::read_at(u64 offset, void* buffer, u64 size) return 0; } + // If present, read the remaining chunk of data on next extent + if (size > max_size && (offset + max_size) < total_size) + { + iso_log.warning("read_at: %s: Extent limit reached reading from file (%llu/%llu)", m_meta.name, max_size, size); + max_size += read_at(offset + max_size, &reinterpret_cast(buffer)[max_size], size - max_size); + } + return max_size; } @@ -1250,13 +1265,14 @@ u64 iso_file::read(void* buffer, u64 size) u64 iso_file::read_at(u64 offset, void* buffer, u64 size) { - const u64 max_size = std::min(size, local_extent_remaining(offset)); + u64 max_size = std::min(size, local_extent_remaining(offset)); if (max_size == 0) { return 0; } + const u64 total_size = this->size(); const u64 archive_first_offset = file_offset(offset); // If it's not a raw device @@ -1270,6 +1286,13 @@ u64 iso_file::read_at(u64 offset, void* buffer, u64 size) return 0; } + // If present, read the remaining chunk of data on next extent + if (size > max_size && (offset + max_size) < total_size) + { + iso_log.warning("read_at: %s: Extent limit reached reading from file (%llu/%llu)", m_meta.name, max_size, size); + max_size += read_at(offset + max_size, &reinterpret_cast(buffer)[max_size], size - max_size); + } + return max_size; } @@ -1324,6 +1347,13 @@ u64 iso_file::read_at(u64 offset, void* buffer, u64 size) return 0; } + // If present, read the remaining chunk of data on next extent + if (size > max_size && (offset + max_size) < total_size) + { + iso_log.warning("read_at: %s: Extent limit reached reading from file (%llu/%llu)", m_meta.name, max_size, size); + max_size += read_at(offset + max_size, &reinterpret_cast(buffer)[max_size], size - max_size); + } + return max_size; } @@ -1363,6 +1393,13 @@ u64 iso_file::read_at(u64 offset, void* buffer, u64 size) return 0; } + // If present, read the remaining chunk of data on next extent + if (size > max_size && (offset + max_size) < total_size) + { + iso_log.warning("read_at: %s: Extent limit reached reading from file (%llu/%llu)", m_meta.name, max_size, size); + max_size += read_at(offset + max_size, &reinterpret_cast(buffer)[max_size], size - max_size); + } + return max_size; }