@@ -627,7 +627,17 @@ 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+ const u64 metadata_headers_offset = sizeof (sce_hdr) + sce_hdr.se_meta + sizeof (meta_info);
631+
632+ if (sce_hdr.se_hsize < metadata_headers_offset ||
633+ sce_hdr.se_hsize - metadata_headers_offset < sizeof (meta_hdr) ||
634+ sce_hdr.se_hsize > sce_f.size ())
635+ {
636+ self_log.error (" Invalid SCE metadata header size!" );
637+ return false ;
638+ }
639+
640+ std::vector<u8 > metadata_headers (sce_hdr.se_hsize - metadata_headers_offset);
631641
632642 // Locate and read the encrypted metadata info.
633643 sce_f.seek (sce_hdr.se_meta + sizeof (sce_hdr));
@@ -1123,7 +1133,17 @@ bool SELFDecrypter::LoadMetadata(const u8* klic_key)
11231133{
11241134 aes_context aes;
11251135 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)));
1136+ const u64 metadata_headers_offset = sizeof (sce_hdr) + sce_hdr.se_meta + sizeof (meta_info);
1137+
1138+ if (sce_hdr.se_hsize < metadata_headers_offset ||
1139+ sce_hdr.se_hsize - metadata_headers_offset < sizeof (meta_hdr) ||
1140+ sce_hdr.se_hsize > self_f.size ())
1141+ {
1142+ self_log.error (" Invalid SELF metadata header size!" );
1143+ return false ;
1144+ }
1145+
1146+ std::vector<u8 > metadata_headers (sce_hdr.se_hsize - metadata_headers_offset);
11271147
11281148 // Locate and read the encrypted metadata info.
11291149 self_f.seek (sce_hdr.se_meta + sizeof (sce_hdr));
0 commit comments