mirror of
https://github.com/Atmosphere-NX/Atmosphere
synced 2024-11-10 07:06:34 +00:00
ro: fix process handle leak when using JitPlugin NROs
This commit is contained in:
parent
28ceedb533
commit
211a828730
3 changed files with 17 additions and 9 deletions
|
@ -382,13 +382,13 @@ namespace ams::ro::impl {
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Context utilities. */
|
/* 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. */
|
/* Validate process handle. */
|
||||||
{
|
{
|
||||||
os::ProcessId handle_pid = os::InvalidProcessId;
|
os::ProcessId handle_pid = os::InvalidProcessId;
|
||||||
|
|
||||||
/* Validate handle is a valid process handle. */
|
/* 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. */
|
/* Validate process id. */
|
||||||
R_UNLESS(handle_pid == process_id, ResultInvalidProcess());
|
R_UNLESS(handle_pid == process_id, ResultInvalidProcess());
|
||||||
|
@ -397,7 +397,7 @@ namespace ams::ro::impl {
|
||||||
/* Check if a process context already exists. */
|
/* Check if a process context already exists. */
|
||||||
R_UNLESS(GetContextByProcessId(process_id) == nullptr, ResultInvalidSession());
|
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();
|
return ResultSuccess();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -413,13 +413,13 @@ namespace ams::ro::impl {
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Service implementations. */
|
/* 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. */
|
/* Get context. */
|
||||||
ProcessContext *context = GetContextById(context_id);
|
ProcessContext *context = GetContextById(context_id);
|
||||||
AMS_ABORT_UNLESS(context != nullptr);
|
AMS_ABORT_UNLESS(context != nullptr);
|
||||||
|
|
||||||
/* Get program id. */
|
/* 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. */
|
/* Validate address/size. */
|
||||||
R_TRY(ValidateAddressAndNonZeroSize(nrr_address, nrr_size));
|
R_TRY(ValidateAddressAndNonZeroSize(nrr_address, nrr_size));
|
||||||
|
|
|
@ -30,12 +30,12 @@ namespace ams::ro::impl {
|
||||||
bool ShouldEaseNroRestriction();
|
bool ShouldEaseNroRestriction();
|
||||||
|
|
||||||
/* Context utilities. */
|
/* 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);
|
Result ValidateProcess(size_t context_id, os::ProcessId process_id);
|
||||||
void UnregisterProcess(size_t context_id);
|
void UnregisterProcess(size_t context_id);
|
||||||
|
|
||||||
/* Service implementations. */
|
/* 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 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 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);
|
Result UnmapManualLoadModuleMemory(size_t context_id, u64 nro_address);
|
||||||
|
|
|
@ -56,12 +56,20 @@ namespace ams::ro {
|
||||||
}
|
}
|
||||||
|
|
||||||
Result RoService::RegisterProcessHandle(const sf::ClientProcessId &client_pid, sf::CopyHandle process_h) {
|
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) {
|
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()));
|
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue