From 78cbfcf1a74c06f0cc01d6e662d31024422ccb7e Mon Sep 17 00:00:00 2001 From: Zephyron Date: Wed, 3 Dec 2025 12:12:14 +1000 Subject: [PATCH] fix: Add safety checks for input processing and callback cleanup - Prevent controller input processing until emulation is fully running - Add null checks and prevent double deletion of NPAD callbacks - Set callback_key to -1 after deletion to prevent reuse Signed-off-by: Zephyron --- src/citron/main.cpp | 5 +++++ src/hid_core/resources/npad/npad.cpp | 7 ++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/citron/main.cpp b/src/citron/main.cpp index dd0d77ab5..4c3a2dbed 100644 --- a/src/citron/main.cpp +++ b/src/citron/main.cpp @@ -5573,6 +5573,11 @@ void GMainWindow::UpdateUISettings() { } void GMainWindow::UpdateInputDrivers() { + // Do not process ANY controller input until emulation is fully running + if (!emulation_running) { + return; + } + if (!input_subsystem) { return; } diff --git a/src/hid_core/resources/npad/npad.cpp b/src/hid_core/resources/npad/npad.cpp index 5d3b8a117..0e2c5d899 100644 --- a/src/hid_core/resources/npad/npad.cpp +++ b/src/hid_core/resources/npad/npad.cpp @@ -1,4 +1,5 @@ // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project +// SPDX-FileCopyrightText: 2025 citron Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include @@ -46,10 +47,14 @@ NPad::NPad(Core::HID::HIDCore& hid_core_, KernelHelpers::ServiceContext& service } NPad::~NPad() { + // Iterate over ALL aruids and ALL controllers to delete every callback for (std::size_t aruid_index = 0; aruid_index < AruidIndexMax; ++aruid_index) { for (std::size_t i = 0; i < controller_data[aruid_index].size(); ++i) { auto& controller = controller_data[aruid_index][i]; - controller.device->DeleteCallback(controller.callback_key); + if (controller.device && controller.callback_key != -1) { + controller.device->DeleteCallback(controller.callback_key); + controller.callback_key = -1; // Prevent double deletion + } } } }