loader/nsp: Move secondary loader initialization to constructor

Prevents nullptr bug when trying to dump the RomFS of an NSP resulting from secondary_loader not being initialized.
This commit is contained in:
Zach Hilman 2018-10-27 10:16:29 -04:00
parent d278f25bda
commit 7c70746ec4

View file

@ -36,6 +36,16 @@ AppLoader_NSP::AppLoader_NSP(FileSys::VirtualFile file)
std::tie(nacp_file, icon_file) = std::tie(nacp_file, icon_file) =
FileSys::PatchManager(nsp->GetProgramTitleID()).ParseControlNCA(*control_nca); FileSys::PatchManager(nsp->GetProgramTitleID()).ParseControlNCA(*control_nca);
if (nsp->IsExtractedType()) {
secondary_loader = std::make_unique<AppLoader_DeconstructedRomDirectory>(nsp->GetExeFS());
} else {
if (title_id == 0)
return;
secondary_loader = std::make_unique<AppLoader_NCA>(
nsp->GetNCAFile(title_id, FileSys::ContentRecordType::Program));
}
} }
AppLoader_NSP::~AppLoader_NSP() = default; AppLoader_NSP::~AppLoader_NSP() = default;
@ -67,26 +77,19 @@ ResultStatus AppLoader_NSP::Load(Kernel::Process& process) {
return ResultStatus::ErrorAlreadyLoaded; return ResultStatus::ErrorAlreadyLoaded;
} }
if (nsp->IsExtractedType()) { if (title_id == 0)
secondary_loader = std::make_unique<AppLoader_DeconstructedRomDirectory>(nsp->GetExeFS()); return ResultStatus::ErrorNSPMissingProgramNCA;
} else {
if (title_id == 0)
return ResultStatus::ErrorNSPMissingProgramNCA;
secondary_loader = std::make_unique<AppLoader_NCA>( if (nsp->GetStatus() != ResultStatus::Success)
nsp->GetNCAFile(title_id, FileSys::ContentRecordType::Program)); return nsp->GetStatus();
if (nsp->GetStatus() != ResultStatus::Success) if (nsp->GetProgramStatus(title_id) != ResultStatus::Success)
return nsp->GetStatus(); return nsp->GetProgramStatus(title_id);
if (nsp->GetProgramStatus(title_id) != ResultStatus::Success) if (nsp->GetNCA(title_id, FileSys::ContentRecordType::Program) == nullptr) {
return nsp->GetProgramStatus(title_id); if (!Core::Crypto::KeyManager::KeyFileExists(false))
return ResultStatus::ErrorMissingProductionKeyFile;
if (nsp->GetNCA(title_id, FileSys::ContentRecordType::Program) == nullptr) { return ResultStatus::ErrorNSPMissingProgramNCA;
if (!Core::Crypto::KeyManager::KeyFileExists(false))
return ResultStatus::ErrorMissingProductionKeyFile;
return ResultStatus::ErrorNSPMissingProgramNCA;
}
} }
const auto result = secondary_loader->Load(process); const auto result = secondary_loader->Load(process);