From 92e26df00f12de2e084ceb84d17ca79c5323a315 Mon Sep 17 00:00:00 2001
From: Zach Hilman <zachhilman@gmail.com>
Date: Mon, 3 Sep 2018 18:46:56 -0400
Subject: [PATCH] nsp: Fix error masking issue with XCI files Now display
 correct error instead of catch-all MissingProgramNCA

---
 src/core/file_sys/card_image.cpp         | 6 +++---
 src/core/file_sys/content_archive.cpp    | 8 ++++++--
 src/core/file_sys/submission_package.cpp | 5 ++++-
 3 files changed, 13 insertions(+), 6 deletions(-)

diff --git a/src/core/file_sys/card_image.cpp b/src/core/file_sys/card_image.cpp
index 1bd3353e40..8218893b2c 100644
--- a/src/core/file_sys/card_image.cpp
+++ b/src/core/file_sys/card_image.cpp
@@ -52,11 +52,11 @@ XCI::XCI(VirtualFile file_) : file(std::move(file_)), partitions(0x4) {
     const auto secure_ncas = secure_partition->GetNCAsCollapsed();
     std::copy(secure_ncas.begin(), secure_ncas.end(), std::back_inserter(ncas));
 
-    program_nca_status = Loader::ResultStatus::ErrorXCIMissingProgramNCA;
     program =
         secure_partition->GetNCA(secure_partition->GetProgramTitleID(), ContentRecordType::Program);
-    if (program != nullptr)
-        program_nca_status = program->GetStatus();
+    program_nca_status = secure_partition->GetProgramStatus(secure_partition->GetProgramTitleID());
+    if (program_nca_status == Loader::ResultStatus::ErrorNSPMissingProgramNCA)
+        program_nca_status = Loader::ResultStatus::ErrorXCIMissingProgramNCA;
 
     auto result = AddNCAFromPartition(XCIPartition::Update);
     if (result != Loader::ResultStatus::Success) {
diff --git a/src/core/file_sys/content_archive.cpp b/src/core/file_sys/content_archive.cpp
index 26e1daf554..1c093d94f3 100644
--- a/src/core/file_sys/content_archive.cpp
+++ b/src/core/file_sys/content_archive.cpp
@@ -444,6 +444,12 @@ NCA::NCA(VirtualFile file_, VirtualFile bktr_base_romfs_, u64 bktr_base_ivfc_off
                     dirs.push_back(std::move(npfs));
                     if (IsDirectoryExeFS(dirs.back()))
                         exefs = dirs.back();
+                } else {
+                    if (has_rights_id)
+                        status = Loader::ResultStatus::ErrorIncorrectTitlekeyOrTitlekek;
+                    else
+                        status = Loader::ResultStatus::ErrorIncorrectKeyAreaKey;
+                    return;
                 }
             } else {
                 if (status != Loader::ResultStatus::Success)
@@ -491,8 +497,6 @@ NCAContentType NCA::GetType() const {
 u64 NCA::GetTitleId() const {
     if (is_update || status == Loader::ResultStatus::ErrorMissingBKTRBaseRomFS)
         return header.title_id | 0x800;
-    if (status != Loader::ResultStatus::Success)
-        return {};
     return header.title_id;
 }
 
diff --git a/src/core/file_sys/submission_package.cpp b/src/core/file_sys/submission_package.cpp
index bde8798616..182b406987 100644
--- a/src/core/file_sys/submission_package.cpp
+++ b/src/core/file_sys/submission_package.cpp
@@ -60,8 +60,11 @@ NSP::NSP(VirtualFile file_)
     for (const auto& outer_file : files) {
         if (outer_file->GetName().substr(outer_file->GetName().size() - 9) == ".cnmt.nca") {
             const auto nca = std::make_shared<NCA>(outer_file);
-            if (nca->GetStatus() != Loader::ResultStatus::Success)
+            if (nca->GetStatus() != Loader::ResultStatus::Success) {
+                program_status[nca->GetTitleId()] = nca->GetStatus();
                 continue;
+            }
+
             const auto section0 = nca->GetSubdirectories()[0];
 
             for (const auto& inner_file : section0->GetFiles()) {