From 6e8c24b2f9945cb5920a8f32def3924d8691e695 Mon Sep 17 00:00:00 2001 From: pixl Date: Sat, 29 Jan 2022 00:05:40 -0500 Subject: [PATCH] Fix a race condition caused by virtual hid nodes When a virtual hidraw node is being tested while the real one is tested, this causes the devices to misidentify reports. This solves that by making the device monitor synchronous. --- src/logid/backend/hidpp/Device.cpp | 6 ++++-- src/logid/backend/hidpp20/EssentialFeature.cpp | 6 ++---- src/logid/backend/hidpp20/features/DeviceName.cpp | 3 --- src/logid/backend/raw/DeviceMonitor.cpp | 6 +++--- 4 files changed, 9 insertions(+), 12 deletions(-) diff --git a/src/logid/backend/hidpp/Device.cpp b/src/logid/backend/hidpp/Device.cpp index 58fd6cf..418cbd4 100644 --- a/src/logid/backend/hidpp/Device.cpp +++ b/src/logid/backend/hidpp/Device.cpp @@ -138,8 +138,10 @@ void Device::_init() } }); try { - auto rsp = sendReport({ReportType::Short, _index, 0, 0, - LOGID_HIDPP_SOFTWARE_ID}); + auto rsp = sendReport( + {ReportType::Short, _index, + hidpp20::FeatureID::ROOT, hidpp20::Root::Ping, + LOGID_HIDPP_SOFTWARE_ID}); if(rsp.deviceIndex() != _index) { throw InvalidDevice(InvalidDevice::VirtualNode); } diff --git a/src/logid/backend/hidpp20/EssentialFeature.cpp b/src/logid/backend/hidpp20/EssentialFeature.cpp index 11b9751..ffd2442 100644 --- a/src/logid/backend/hidpp20/EssentialFeature.cpp +++ b/src/logid/backend/hidpp20/EssentialFeature.cpp @@ -42,7 +42,7 @@ std::vector EssentialFeature::callFunction(uint8_t function_id, std::copy(params.begin(), params.end(), request.paramBegin()); auto response = _device->sendReport(request); - return std::vector(response.paramBegin(), response.paramEnd()); + return {response.paramBegin(), response.paramEnd()}; } EssentialFeature::EssentialFeature(hidpp::Device* dev, uint16_t _id) : @@ -56,9 +56,7 @@ EssentialFeature::EssentialFeature(hidpp::Device* dev, uint16_t _id) : getFunc_req[0] = (_id >> 8) & 0xff; getFunc_req[1] = _id & 0xff; try { - auto getFunc_resp = this->callFunction(Root::GetFeature, - getFunc_req); - _index = getFunc_resp[0]; + _index = this->callFunction(Root::GetFeature,getFunc_req).at(0); } catch(Error& e) { if(e.code() == Error::InvalidFeatureIndex) throw UnsupportedFeature(_id); diff --git a/src/logid/backend/hidpp20/features/DeviceName.cpp b/src/logid/backend/hidpp20/features/DeviceName.cpp index 8b8e7a4..deed409 100644 --- a/src/logid/backend/hidpp20/features/DeviceName.cpp +++ b/src/logid/backend/hidpp20/features/DeviceName.cpp @@ -75,9 +75,6 @@ uint8_t EssentialDeviceName::getNameLength() auto response = this->callFunction(DeviceName::Function::GetLength, params); - if(response[0] == 1) - return 1; - return response[0]; } diff --git a/src/logid/backend/raw/DeviceMonitor.cpp b/src/logid/backend/raw/DeviceMonitor.cpp index 2a1756f..d8de3c6 100644 --- a/src/logid/backend/raw/DeviceMonitor.cpp +++ b/src/logid/backend/raw/DeviceMonitor.cpp @@ -99,9 +99,9 @@ void DeviceMonitor::ready() std::string devnode = udev_device_get_devnode(device); if (action == "add") - spawn_task([this, devnode]() { _addHandler(devnode); } ); + _addHandler(devnode); else if (action == "remove") - spawn_task([this, devnode]() { _removeHandler(devnode); } ); + _removeHandler(devnode); udev_device_unref(device); }, @@ -141,7 +141,7 @@ void DeviceMonitor::enumerate() std::string devnode = udev_device_get_devnode(device); udev_device_unref(device); - spawn_task([this, devnode]() { _addHandler(devnode); } ); + _addHandler(devnode); } udev_enumerate_unref(udev_enum);