From eaef23d43af3ceaa0aa01387f70ec9307a8f8081 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Sun, 9 Aug 2026 01:40:12 +0200 Subject: [PATCH] unself: fix overflow checks --- rpcs3/Crypto/unself.cpp | 10 +++++----- rpcs3/Crypto/unself.h | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/rpcs3/Crypto/unself.cpp b/rpcs3/Crypto/unself.cpp index e9a9ef46c1..e6b166da24 100644 --- a/rpcs3/Crypto/unself.cpp +++ b/rpcs3/Crypto/unself.cpp @@ -688,7 +688,7 @@ bool SCEDecrypter::LoadMetadata(const u8 erk[32], const u8 riv[16]) const usz data_keys_offset = sizeof(meta_hdr) + meta_hdr.section_count * sizeof(MetadataSectionHeader); ensure(metadata_headers.size() >= (data_keys_offset + data_keys.size())); - ensure(data_keys.size() > (u64{umax} - data_keys_offset)); // Check for overflow + ensure(data_keys.size() <= (usz{umax} - data_keys_offset)); // Check for overflow std::memcpy(data_keys.data(), metadata_headers.data() + data_keys_offset, data_keys.size()); return true; @@ -743,7 +743,7 @@ bool SCEDecrypter::DecryptData() // Copy the decrypted data. ensure(data_buf.size() >= (buf.size() + data_buf_offset)); - ensure(buf.size() > (u64{umax} - static_cast(data_buf_offset))); // Check for overflow + ensure(buf.size() <= (usz{umax} - static_cast(data_buf_offset))); // Check for overflow std::memcpy(data_buf.data() + data_buf_offset, buf.data(), buf.size()); } } @@ -754,7 +754,7 @@ bool SCEDecrypter::DecryptData() sce_f.read(buf.data(), buf.size()); ensure(data_buf.size() >= (buf.size() + data_buf_offset)); - ensure(buf.size() > (u64{umax} - static_cast(data_buf_offset))); // Check for overflow + ensure(buf.size() <= (usz{umax} - static_cast(data_buf_offset))); // Check for overflow std::memcpy(data_buf.data() + data_buf_offset, buf.data(), buf.size()); } @@ -1195,7 +1195,7 @@ bool SELFDecrypter::LoadMetadata(const u8* klic_key) const usz data_keys_offset = sizeof(meta_hdr) + meta_hdr.section_count * sizeof(MetadataSectionHeader); ensure(metadata_headers.size() >= (data_keys_offset + data_keys.size())); - ensure(data_keys.size() > (u64{umax} - data_keys_offset)); // Check for overflow + ensure(data_keys.size() <= (usz{umax} - data_keys_offset)); // Check for overflow std::memcpy(data_keys.data(), metadata_headers.data() + data_keys_offset, data_keys.size()); return true; @@ -1254,7 +1254,7 @@ bool SELFDecrypter::DecryptData() // Copy the decrypted data. ensure(data_buf.size() >= (buf.size() + data_buf_offset)); - ensure(buf.size() > (u64{umax} - static_cast(data_buf_offset))); // Check for overflow + ensure(buf.size() <= (usz{umax} - static_cast(data_buf_offset))); // Check for overflow std::memcpy(data_buf.data() + data_buf_offset, buf.data(), buf.size()); // Advance the buffer's offset. diff --git a/rpcs3/Crypto/unself.h b/rpcs3/Crypto/unself.h index b32cd5c524..22eafb074b 100644 --- a/rpcs3/Crypto/unself.h +++ b/rpcs3/Crypto/unself.h @@ -546,7 +546,7 @@ private: { // Seek to the program header data offset and write the data. ensure(data_buf.size() >= (hdr.data_size + data_buf_offset)); - ensure(hdr.data_size > (u64{umax} - static_cast(data_buf_offset))); // Check for overflow + ensure(hdr.data_size <= (u64{umax} - static_cast(data_buf_offset))); // Check for overflow e.seek(phdr.p_offset); e.write(data_buf.data() + data_buf_offset, hdr.data_size);