Skip to content

Commit ad73c1e

Browse files
authored
Input: Fix race condition in button mapping access (#1900)
1 parent 2fd322e commit ad73c1e

2 files changed

Lines changed: 9 additions & 2 deletions

File tree

src/input/InputManager.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -696,7 +696,7 @@ std::shared_ptr<VPADController> InputManager::get_vpad_controller(size_t index)
696696
return {};
697697

698698
std::shared_lock lock(m_mutex);
699-
return std::static_pointer_cast<VPADController>(m_vpad[index]);
699+
return std::dynamic_pointer_cast<VPADController>(m_vpad[index]);
700700
}
701701

702702
std::shared_ptr<WPADController> InputManager::get_wpad_controller(size_t index) const
@@ -705,7 +705,7 @@ std::shared_ptr<WPADController> InputManager::get_wpad_controller(size_t index)
705705
return {};
706706

707707
std::shared_lock lock(m_mutex);
708-
return std::static_pointer_cast<WPADController>(m_wpad[index]);
708+
return std::dynamic_pointer_cast<WPADController>(m_wpad[index]);
709709
}
710710

711711
std::pair<size_t, size_t> InputManager::get_controller_count() const

src/input/emulated/EmulatedController.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -263,6 +263,7 @@ void EmulatedController::clear_controllers()
263263

264264
float EmulatedController::get_axis_value(uint64 mapping) const
265265
{
266+
std::shared_lock lock(m_mutex);
266267
const auto it = m_mappings.find(mapping);
267268
if (it != m_mappings.cend())
268269
{
@@ -276,6 +277,7 @@ float EmulatedController::get_axis_value(uint64 mapping) const
276277

277278
bool EmulatedController::is_mapping_down(uint64 mapping) const
278279
{
280+
std::shared_lock lock(m_mutex);
279281
const auto it = m_mappings.find(mapping);
280282
if (it != m_mappings.cend())
281283
{
@@ -288,6 +290,7 @@ bool EmulatedController::is_mapping_down(uint64 mapping) const
288290

289291
std::string EmulatedController::get_mapping_name(uint64 mapping) const
290292
{
293+
std::shared_lock lock(m_mutex);
291294
const auto it = m_mappings.find(mapping);
292295
if (it != m_mappings.cend())
293296
{
@@ -301,6 +304,7 @@ std::string EmulatedController::get_mapping_name(uint64 mapping) const
301304

302305
std::shared_ptr<ControllerBase> EmulatedController::get_mapping_controller(uint64 mapping) const
303306
{
307+
std::shared_lock lock(m_mutex);
304308
const auto it = m_mappings.find(mapping);
305309
if (it != m_mappings.cend())
306310
{
@@ -314,17 +318,20 @@ std::shared_ptr<ControllerBase> EmulatedController::get_mapping_controller(uint6
314318

315319
void EmulatedController::delete_mapping(uint64 mapping)
316320
{
321+
std::scoped_lock lock(m_mutex);
317322
m_mappings.erase(mapping);
318323
}
319324

320325
void EmulatedController::clear_mappings()
321326
{
327+
std::scoped_lock lock(m_mutex);
322328
m_mappings.clear();
323329
}
324330

325331
void EmulatedController::set_mapping(uint64 mapping, const std::shared_ptr<ControllerBase>& controller,
326332
uint64 button)
327333
{
334+
std::scoped_lock lock(m_mutex);
328335
m_mappings[mapping] = { controller, button };
329336
}
330337

0 commit comments

Comments
 (0)