From 57ee3128b5333105bb0b51eec97b4bffa8ffc04d Mon Sep 17 00:00:00 2001 From: substanc3 Date: Tue, 23 Feb 2021 23:09:28 +0100 Subject: [PATCH] sm: make sure handles don't get clobbered on failure --- stratosphere/sm/source/impl/sm_service_manager.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/stratosphere/sm/source/impl/sm_service_manager.cpp b/stratosphere/sm/source/impl/sm_service_manager.cpp index 48e1de943..b8fd8551c 100644 --- a/stratosphere/sm/source/impl/sm_service_manager.cpp +++ b/stratosphere/sm/source/impl/sm_service_manager.cpp @@ -407,10 +407,16 @@ namespace ams::sm::impl { ServiceInfo *free_service = GetFreeServiceInfo(); R_UNLESS(free_service != nullptr, sm::ResultOutOfServices()); + /* Make sure we keep the handles clean */ + auto handle_guard = SCOPE_GUARD { *out = INVALID_HANDLE; *(free_service->port_h.GetPointer()) = INVALID_HANDLE; }; + /* Create the new service. */ *out = INVALID_HANDLE; R_TRY(svcCreatePort(out, free_service->port_h.GetPointerAndClear(), max_sessions, is_light, free_service->name.name)); + /* We succeeded! */ + handle_guard.Cancel(); + /* Save info. */ free_service->name = service; free_service->owner_process_id = process_id;