From b59e9199192a0a15b44e415df7a21eff47f5661c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9o=20Lam?= Date: Mon, 15 Aug 2016 11:31:14 +0200 Subject: [PATCH] InputConfigDiag: Fix a segfault caused by missing check The original code assumed that we would always find a button in control_buttons. However, this is incorrect, since the iterator can and will be control_buttons.end() if the button that triggered the iterate code is not in control_buttons, which happens when it's in an exclude list. --- Source/Core/DolphinWX/InputConfigDiag.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Source/Core/DolphinWX/InputConfigDiag.cpp b/Source/Core/DolphinWX/InputConfigDiag.cpp index 62efa38430..5971e3ac60 100644 --- a/Source/Core/DolphinWX/InputConfigDiag.cpp +++ b/Source/Core/DolphinWX/InputConfigDiag.cpp @@ -523,12 +523,14 @@ void ControlDialog::DetectControl(wxCommandEvent& event) void GamepadPage::DetectControl(wxCommandEvent& event) { - ControlButton* btn = (ControlButton*)event.GetEventObject(); - if (DetectButton(btn) && m_iterate == true) + auto* btn = static_cast(event.GetEventObject()); + if (DetectButton(btn) && m_iterate) { auto it = std::find(control_buttons.begin(), control_buttons.end(), btn); + // it can and will be control_buttons.end() for any control that is in the exclude list. + if (it == control_buttons.end()) + return; - // std find will never return end since btn will always be found in control_buttons ++it; for (; it != control_buttons.end(); ++it) {