From 9f9c351f547e52ffa7d02600db4ad0630661a969 Mon Sep 17 00:00:00 2001 From: David-cmrg <202826622+David-cmrg@users.noreply.github.com> Date: Tue, 13 Oct 2026 03:07:29 +0200 Subject: [PATCH] fix(libSceSystemService): run guest exit handlers first on LoadExec exit --- core/libs/prx/libSceSystemService/Export.cpp | 5 +---- core/libs/tests/GuestSystemExit.cpp | 6 +++++- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/core/libs/prx/libSceSystemService/Export.cpp b/core/libs/prx/libSceSystemService/Export.cpp index b87c8a63d..9be5e8df6 100644 --- a/core/libs/prx/libSceSystemService/Export.cpp +++ b/core/libs/prx/libSceSystemService/Export.cpp @@ -192,10 +192,7 @@ extern "C" { int APS5_VABI sceSystemServiceLoadExec(const char* path, const char* const* arguments) { if (!path || !*path) return SYSTEM_SERVICE_ERROR_PARAMETER; - if (std::strcmp(path, "exit") == 0) { - LibcRunShutdown_nid_postfix(); - std::exit(0); - } + if (std::strcmp(path, "exit") == 0) LibcExit_nid_no_patch(0); auto launch = PrepareLaunch(path, arguments); LibcRunShutdown_nid_postfix(); std::fflush(nullptr); diff --git a/core/libs/tests/GuestSystemExit.cpp b/core/libs/tests/GuestSystemExit.cpp index f0d40600b..56c414635 100644 --- a/core/libs/tests/GuestSystemExit.cpp +++ b/core/libs/tests/GuestSystemExit.cpp @@ -18,6 +18,7 @@ #include #endif extern "C" int APS5_VABI sceSystemServiceLoadExec(const char*, const char* const*); +extern "C" int APS5_VABI __cxa_atexit_nid_postfix(void (APS5_VABI *func)(void*), void* arg, void* dsoHandle); extern "C" void APS5_VABI _Exit_nid_postfix(int); extern "C" void APS5_VABI catchReturnFromMain_nid_postfix(int); using GuestQuickExitCallback = void (APS5_VABI*)(); @@ -25,9 +26,11 @@ extern "C" int APS5_VABI at_quick_exit_nid_postfix(GuestQuickExitCallback); extern "C" void APS5_VABI quick_exit_nid_postfix(int); namespace { bool cleaned = false; +bool finalized = false; void Cleanup() { cleaned = true; } +void APS5_VABI Finalize(void*) { finalized = true; } void VerifyExit() { - if (!cleaned) std::_Exit(1); + if (!cleaned || !finalized) std::_Exit(1); std::puts("Guest shutdown and atexit completed"); } int quickOrder = 0; @@ -164,6 +167,7 @@ int main(int argc, char** argv) { } if (argc > 1) { LibcRegisterShutdown_nid_postfix(Cleanup); + Require(__cxa_atexit_nid_postfix(Finalize, nullptr, nullptr) == 0); Require(std::atexit(VerifyExit) == 0); sceSystemServiceLoadExec("exit", nullptr); return 2;