From 85030c6e6bfe83b6671de45b25535fe3ef713319 Mon Sep 17 00:00:00 2001
From: Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
Date: Tue, 6 Jan 2015 19:49:25 +0000
Subject: [PATCH] Loader: Never forget to change is_loaded.

---
 src/core/loader/3dsx.cpp | 7 +++++++
 src/core/loader/3dsx.h   | 2 +-
 src/core/loader/elf.cpp  | 4 +++-
 src/core/loader/elf.h    | 2 +-
 src/core/loader/ncch.cpp | 5 ++---
 src/core/loader/ncch.h   | 2 +-
 6 files changed, 15 insertions(+), 7 deletions(-)

diff --git a/src/core/loader/3dsx.cpp b/src/core/loader/3dsx.cpp
index 06827668f..15032e0ae 100644
--- a/src/core/loader/3dsx.cpp
+++ b/src/core/loader/3dsx.cpp
@@ -215,13 +215,20 @@ AppLoader_THREEDSX::~AppLoader_THREEDSX() {
 
 ResultStatus AppLoader_THREEDSX::Load() {
     LOG_INFO(Loader, "Loading 3DSX file %s...", filename.c_str());
+
+    if (is_loaded)
+        return ResultStatus::ErrorAlreadyLoaded;
+
     FileUtil::IOFile file(filename, "rb");
+
     if (file.IsOpen()) {
         THREEDSXReader::Load3DSXFile(filename, 0x00100000);
         Kernel::LoadExec(0x00100000);
     } else {
         return ResultStatus::Error;
     }
+
+    is_loaded = true;
     return ResultStatus::Success;
 }
 
diff --git a/src/core/loader/3dsx.h b/src/core/loader/3dsx.h
index da8836662..f28224628 100644
--- a/src/core/loader/3dsx.h
+++ b/src/core/loader/3dsx.h
@@ -26,7 +26,7 @@ public:
 
 private:
     std::string filename;
-    bool        is_loaded;
+    bool        is_loaded = false;
 };
 
 } // namespace Loader
diff --git a/src/core/loader/elf.cpp b/src/core/loader/elf.cpp
index 89664229a..ee711d8b2 100644
--- a/src/core/loader/elf.cpp
+++ b/src/core/loader/elf.cpp
@@ -331,7 +331,7 @@ bool ElfReader::LoadSymbols() {
 namespace Loader {
 
 /// AppLoader_ELF constructor
-AppLoader_ELF::AppLoader_ELF(const std::string& filename) : is_loaded(false) {
+AppLoader_ELF::AppLoader_ELF(const std::string& filename) {
     this->filename = filename;
 }
 
@@ -358,6 +358,8 @@ ResultStatus AppLoader_ELF::Load() {
     } else {
         return ResultStatus::Error;
     }
+
+    is_loaded = true;
     return ResultStatus::Success;
 }
 
diff --git a/src/core/loader/elf.h b/src/core/loader/elf.h
index c221cce6d..856722f1e 100644
--- a/src/core/loader/elf.h
+++ b/src/core/loader/elf.h
@@ -26,7 +26,7 @@ public:
 
 private:
     std::string filename;
-    bool        is_loaded;
+    bool        is_loaded = false;
 };
 
 } // namespace Loader
diff --git a/src/core/loader/ncch.cpp b/src/core/loader/ncch.cpp
index f1d01252e..0793cc7cd 100644
--- a/src/core/loader/ncch.cpp
+++ b/src/core/loader/ncch.cpp
@@ -102,7 +102,6 @@ static bool LZSS_Decompress(u8* compressed, u32 compressed_size, u8* decompresse
 /// AppLoader_NCCH constructor
 AppLoader_NCCH::AppLoader_NCCH(const std::string& filename) {
     this->filename = filename;
-    is_loaded = false;
     is_compressed = false;
     entry_point = 0;
     ncch_offset = 0;
@@ -221,10 +220,10 @@ ResultStatus AppLoader_NCCH::Load() {
         file.Seek(exefs_offset + ncch_offset, 0);
         file.ReadBytes(&exefs_header, sizeof(ExeFs_Header));
 
-        is_loaded = true; // Set state to loaded
-
         LoadExec(); // Load the executable into memory for booting
 
+        is_loaded = true; // Set state to loaded
+
         return ResultStatus::Success;
     } else {
         LOG_ERROR(Loader, "Unable to read file %s!", filename.c_str());
diff --git a/src/core/loader/ncch.h b/src/core/loader/ncch.h
index fd9258970..184a20d98 100644
--- a/src/core/loader/ncch.h
+++ b/src/core/loader/ncch.h
@@ -215,7 +215,7 @@ private:
 
     std::string     filename;
 
-    bool            is_loaded;
+    bool            is_loaded = false;
     bool            is_compressed;
 
     u32             entry_point;