diff --git a/stratosphere/ro/source/impl/ro_service_impl.cpp b/stratosphere/ro/source/impl/ro_service_impl.cpp index c90c57418..54cd6555a 100644 --- a/stratosphere/ro/source/impl/ro_service_impl.cpp +++ b/stratosphere/ro/source/impl/ro_service_impl.cpp @@ -382,13 +382,13 @@ namespace ams::ro::impl { } /* Context utilities. */ - Result RegisterProcess(size_t *out_context_id, Handle process_handle, os::ProcessId process_id) { + Result RegisterProcess(size_t *out_context_id, os::ManagedHandle process_handle, os::ProcessId process_id) { /* Validate process handle. */ { os::ProcessId handle_pid = os::InvalidProcessId; /* Validate handle is a valid process handle. */ - R_UNLESS(R_SUCCEEDED(os::TryGetProcessId(&handle_pid, process_handle)), ResultInvalidProcess()); + R_UNLESS(R_SUCCEEDED(os::TryGetProcessId(&handle_pid, process_handle.Get())), ResultInvalidProcess()); /* Validate process id. */ R_UNLESS(handle_pid == process_id, ResultInvalidProcess()); @@ -397,7 +397,7 @@ namespace ams::ro::impl { /* Check if a process context already exists. */ R_UNLESS(GetContextByProcessId(process_id) == nullptr, ResultInvalidSession()); - *out_context_id = AllocateContext(process_handle, process_id); + *out_context_id = AllocateContext(process_handle.Move(), process_id); return ResultSuccess(); } @@ -413,13 +413,13 @@ namespace ams::ro::impl { } /* Service implementations. */ - Result RegisterModuleInfo(size_t context_id, Handle process_h, u64 nrr_address, u64 nrr_size, NrrKind nrr_kind, bool enforce_nrr_kind) { + Result RegisterModuleInfo(size_t context_id, os::ManagedHandle process_handle, u64 nrr_address, u64 nrr_size, NrrKind nrr_kind, bool enforce_nrr_kind) { /* Get context. */ ProcessContext *context = GetContextById(context_id); AMS_ABORT_UNLESS(context != nullptr); /* Get program id. */ - const ncm::ProgramId program_id = context->GetProgramId(process_h); + const ncm::ProgramId program_id = context->GetProgramId(process_handle.Get()); /* Validate address/size. */ R_TRY(ValidateAddressAndNonZeroSize(nrr_address, nrr_size)); diff --git a/stratosphere/ro/source/impl/ro_service_impl.hpp b/stratosphere/ro/source/impl/ro_service_impl.hpp index 32dbeb5cd..76cfe8242 100644 --- a/stratosphere/ro/source/impl/ro_service_impl.hpp +++ b/stratosphere/ro/source/impl/ro_service_impl.hpp @@ -30,12 +30,12 @@ namespace ams::ro::impl { bool ShouldEaseNroRestriction(); /* Context utilities. */ - Result RegisterProcess(size_t *out_context_id, Handle process_handle, os::ProcessId process_id); + Result RegisterProcess(size_t *out_context_id, os::ManagedHandle process_handle, os::ProcessId process_id); Result ValidateProcess(size_t context_id, os::ProcessId process_id); void UnregisterProcess(size_t context_id); /* Service implementations. */ - Result RegisterModuleInfo(size_t context_id, Handle process_h, u64 nrr_address, u64 nrr_size, NrrKind nrr_kind, bool enforce_nrr_kind); + Result RegisterModuleInfo(size_t context_id, os::ManagedHandle process_h, u64 nrr_address, u64 nrr_size, NrrKind nrr_kind, bool enforce_nrr_kind); Result UnregisterModuleInfo(size_t context_id, u64 nrr_address); Result MapManualLoadModuleMemory(u64 *out_address, size_t context_id, u64 nro_address, u64 nro_size, u64 bss_address, u64 bss_size); Result UnmapManualLoadModuleMemory(size_t context_id, u64 nro_address); diff --git a/stratosphere/ro/source/ro_ro_service.cpp b/stratosphere/ro/source/ro_ro_service.cpp index a00759557..13c91118d 100644 --- a/stratosphere/ro/source/ro_ro_service.cpp +++ b/stratosphere/ro/source/ro_ro_service.cpp @@ -56,12 +56,20 @@ namespace ams::ro { } Result RoService::RegisterProcessHandle(const sf::ClientProcessId &client_pid, sf::CopyHandle process_h) { - return impl::RegisterProcess(std::addressof(this->context_id), process_h.GetValue(), client_pid.GetValue()); + /* Ensure we manage references to the process handle correctly. */ + os::ManagedHandle process_handle(process_h.GetValue()); + + /* Register the process. */ + return impl::RegisterProcess(std::addressof(this->context_id), std::move(process_handle), client_pid.GetValue()); } Result RoService::RegisterProcessModuleInfo(const sf::ClientProcessId &client_pid, u64 nrr_address, u64 nrr_size, sf::CopyHandle process_h) { + /* Ensure we manage references to the process handle correctly. */ + os::ManagedHandle process_handle(process_h.GetValue()); + + /* Register the module. */ R_TRY(impl::ValidateProcess(this->context_id, client_pid.GetValue())); - return impl::RegisterModuleInfo(this->context_id, process_h.GetValue(), nrr_address, nrr_size, this->nrr_kind, this->nrr_kind == NrrKind_JitPlugin); + return impl::RegisterModuleInfo(this->context_id, std::move(process_handle), nrr_address, nrr_size, this->nrr_kind, this->nrr_kind == NrrKind_JitPlugin); } }