@ -3,7 +3,6 @@
// Refer to the license.txt file included.
# include <cstddef>
# include <cstring>
# include <vector>
# include "common/logging/log.h"
@ -17,28 +16,30 @@ ProgramMetadata::ProgramMetadata() = default;
ProgramMetadata : : ~ ProgramMetadata ( ) = default ;
Loader : : ResultStatus ProgramMetadata : : Load ( VirtualFile file ) {
std : : size_t total_size = static_cast < std : : size_t > ( file - > GetSize ( ) ) ;
if ( total_size < sizeof ( Header ) )
const std : : size_t total_size = file - > GetSize ( ) ;
if ( total_size < sizeof ( Header ) ) {
return Loader : : ResultStatus : : ErrorBadNPDMHeader ;
}
// TODO(DarkLordZach): Use ReadObject when Header/AcidHeader becomes trivially copyable.
std : : vector < u8 > npdm_header_data = file - > ReadBytes ( sizeof ( Header ) ) ;
if ( sizeof ( Header ) ! = npdm_header_data . size ( ) )
if ( sizeof ( Header ) ! = file - > ReadObject ( & npdm_header ) ) {
return Loader : : ResultStatus : : ErrorBadNPDMHeader ;
std : : memcpy ( & npdm_header , npdm_header_data . data ( ) , sizeof ( Header ) ) ;
}
std : : vector < u8 > acid_header_data = file - > ReadBytes ( sizeof ( AcidHeader ) , npdm_header . acid_offset ) ;
if ( sizeof ( AcidHeader ) ! = acid_header_data . size ( ) )
if ( sizeof ( AcidHeader ) ! = file - > ReadObject ( & acid_header , npdm_header . acid_offset ) ) {
return Loader : : ResultStatus : : ErrorBadACIDHeader ;
std : : memcpy ( & acid_header , acid_header_data . data ( ) , sizeof ( AcidHeader ) ) ;
}
if ( sizeof ( AciHeader ) ! = file - > ReadObject ( & aci_header , npdm_header . aci_offset ) )
if ( sizeof ( AciHeader ) ! = file - > ReadObject ( & aci_header , npdm_header . aci_offset ) ) {
return Loader : : ResultStatus : : ErrorBadACIHeader ;
}
if ( sizeof ( FileAccessControl ) ! = file - > ReadObject ( & acid_file_access , acid_header . fac_offset ) )
if ( sizeof ( FileAccessControl ) ! = file - > ReadObject ( & acid_file_access , acid_header . fac_offset ) ) {
return Loader : : ResultStatus : : ErrorBadFileAccessControl ;
if ( sizeof ( FileAccessHeader ) ! = file - > ReadObject ( & aci_file_access , aci_header . fah_offset ) )
}
if ( sizeof ( FileAccessHeader ) ! = file - > ReadObject ( & aci_file_access , aci_header . fah_offset ) ) {
return Loader : : ResultStatus : : ErrorBadFileAccessHeader ;
}
aci_kernel_capabilities . resize ( aci_header . kac_size / sizeof ( u32 ) ) ;
const u64 read_size = aci_header . kac_size ;