diff options
| author | Silent <zdanio95@gmail.com> | 2019-09-02 21:44:43 +0200 |
|---|---|---|
| committer | Rick Gibbed <rick@gibbed.us> | 2020-01-27 06:35:10 -0600 |
| commit | 9d48e904da7e0bc4c450c4e269eea6e9c3fb6323 (patch) | |
| tree | 079036fcd4ba22983f39ab9d623263ca1f75b84e | |
| parent | f278e30d210e7e7173baae796786b34cf89f5694 (diff) | |
[Kernel] (Partially) fix module refcounting
.xex module handles were retained twice in several places,
possibly causing them to leak.
More placed may have to be fixed too.
| -rw-r--r-- | src/xenia/kernel/kernel_state.cc | 8 | ||||
| -rw-r--r-- | src/xenia/kernel/xboxkrnl/xboxkrnl_modules.cc | 6 |
2 files changed, 7 insertions, 7 deletions
diff --git a/src/xenia/kernel/kernel_state.cc b/src/xenia/kernel/kernel_state.cc index 57097148e..83f10bbdd 100644 --- a/src/xenia/kernel/kernel_state.cc +++ b/src/xenia/kernel/kernel_state.cc @@ -367,8 +367,7 @@ object_ref<UserModule> KernelState::LoadUserModule(const char* raw_name, // See if we've already loaded it for (auto& existing_module : user_modules_) { if (existing_module->path() == path) { - existing_module->Retain(); - return retain_object(existing_module.get()); + return existing_module; } } @@ -378,14 +377,13 @@ object_ref<UserModule> KernelState::LoadUserModule(const char* raw_name, module = object_ref<UserModule>(new UserModule(this)); X_STATUS status = module->LoadFromFile(path); if (XFAILED(status)) { - object_table()->RemoveHandle(module->handle()); + object_table()->ReleaseHandle(module->handle()); return nullptr; } global_lock.lock(); - // Retain when putting into the listing. - module->Retain(); + // Putting into the listing automatically retains. user_modules_.push_back(module); } diff --git a/src/xenia/kernel/xboxkrnl/xboxkrnl_modules.cc b/src/xenia/kernel/xboxkrnl/xboxkrnl_modules.cc index 81a44c553..f6d93a9f2 100644 --- a/src/xenia/kernel/xboxkrnl/xboxkrnl_modules.cc +++ b/src/xenia/kernel/xboxkrnl/xboxkrnl_modules.cc @@ -96,8 +96,10 @@ dword_result_t XexLoadImage(lpstring_t module_name, dword_t module_flags, // Not found; attempt to load as a user module. auto user_module = kernel_state()->LoadUserModule(module_name); if (user_module) { - user_module->Retain(); - hmodule = user_module->hmodule_ptr(); + // Give up object ownership, this reference will be released by the last + // XexUnloadImage call + auto user_module_raw = user_module.release(); + hmodule = user_module_raw->hmodule_ptr(); result = X_STATUS_SUCCESS; } } |
