@@ -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