Skip to content

Commit 160d50e

Browse files
authored
Merge branch 'master' into sstates
2 parents f9ce374 + db543e0 commit 160d50e

2 files changed

Lines changed: 29 additions & 3 deletions

File tree

3rdparty/libsdl-org/SDL

Submodule SDL updated 67 files

rpcs3/Crypto/unself.cpp

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -627,7 +627,20 @@ bool SCEDecrypter::LoadMetadata(const u8 erk[32], const u8 riv[16])
627627
{
628628
aes_context aes;
629629
std::vector<u8> metadata_info(sizeof(meta_info));
630-
std::vector<u8> metadata_headers(sce_hdr.se_hsize - (sizeof(sce_hdr) + sce_hdr.se_meta + sizeof(meta_info)));
630+
constexpr usz sizeof_meta_and_header = sizeof(meta_info) + sizeof(sce_hdr);
631+
const usz metadata_offset = static_cast<usz>(sce_hdr.se_meta);
632+
633+
if (metadata_offset > usz{umax} - sizeof_meta_and_header ||
634+
sce_hdr.se_hsize < sizeof_meta_and_header + metadata_offset ||
635+
sce_hdr.se_hsize - (sizeof_meta_and_header + metadata_offset) < sizeof(meta_hdr) ||
636+
sce_hdr.se_hsize > sce_f.size())
637+
{
638+
self_log.error("Invalid SCE metadata header size!");
639+
return false;
640+
}
641+
642+
const usz metadata_headers_offset = sizeof_meta_and_header + metadata_offset;
643+
std::vector<u8> metadata_headers(sce_hdr.se_hsize - metadata_headers_offset);
631644

632645
// Locate and read the encrypted metadata info.
633646
sce_f.seek(sce_hdr.se_meta + sizeof(sce_hdr));
@@ -1123,7 +1136,20 @@ bool SELFDecrypter::LoadMetadata(const u8* klic_key)
11231136
{
11241137
aes_context aes;
11251138
std::vector<u8> metadata_info(sizeof(meta_info));
1126-
std::vector<u8> metadata_headers(sce_hdr.se_hsize - (sizeof(sce_hdr) + sce_hdr.se_meta + sizeof(meta_info)));
1139+
constexpr usz sizeof_meta_and_header = sizeof(meta_info) + sizeof(sce_hdr);
1140+
const usz metadata_offset = static_cast<usz>(sce_hdr.se_meta);
1141+
1142+
if (metadata_offset > usz{umax} - sizeof_meta_and_header ||
1143+
sce_hdr.se_hsize < sizeof_meta_and_header + metadata_offset ||
1144+
sce_hdr.se_hsize - (sizeof_meta_and_header + metadata_offset) < sizeof(meta_hdr) ||
1145+
sce_hdr.se_hsize > self_f.size())
1146+
{
1147+
self_log.error("Invalid SELF metadata header size!");
1148+
return false;
1149+
}
1150+
1151+
const usz metadata_headers_offset = sizeof_meta_and_header + metadata_offset;
1152+
std::vector<u8> metadata_headers(sce_hdr.se_hsize - metadata_headers_offset);
11271153

11281154
// Locate and read the encrypted metadata info.
11291155
self_f.seek(sce_hdr.se_meta + sizeof(sce_hdr));

0 commit comments

Comments
 (0)