[PR #473] [MERGED] fix(input): match the DualSense hidraw node by its HID name #488

Closed
opened 2026-10-15 13:00:58 +00:00 by bsakaguchi · 0 comments
Owner

📋 Pull Request Information

Original PR: https://github.com/games-on-whales/wolf/pull/473
Author: @zerofltexx
Created: 8/9/2026
Status: ✅ Merged
Merged: 9/7/2026
Merged by: @ABeltramo

Base: stable ← Head: fix/hidraw-seat-isolation


📝 Commits (1)

  • 00e6c85 fix(input): match the DualSense hidraw node by its HID name

📊 Changes

1 file changed (+4 additions, -2 deletions)

View changed files

📝 85-wolf.rules (+4 -2)

📄 Description

The rule for the hidraw node came in with the input ones and uses the same ATTRS{name}=="Wolf virtual" form. Before that there was no hidraw rule at all. A hidraw device has no name attribute in its parent chain though. name lives on the sibling input device, so ATTRS has nothing to walk up to and the rule does not reach the node.

/dev/hidraw* for the virtual DualSense stays on ID_SEAT=seat0, so logind grants the desktop user a uaccess ACL on it. Steam on the host then reads the streamed pad and shows it connected with a battery level. The three input nodes are covered, so this is the one device still reachable.

Match the parent's uevent instead. It carries the same string as HID_NAME, so the rule keeps using the "Wolf virtual" glob the input rules use.

The uhid devpath is the simpler match but it is far too broad. BlueZ creates every Bluetooth HID device through uhid. On the hidraw node a real DualSense looks like the virtual one: bus 0005, vendor 054C, product 0CE6, driver playstation, same modalias. Only HID_NAME differs. With both paired at once a devpath match takes the real controller as well and strips its ACL, which breaks gyro, touchpad, LEDs and battery reporting for a real pad on the host.

udev's * spans newlines, so the trailing glob can run past the end of the HID_NAME line. The next lines are HID_PHYS, HID_UNIQ and MODALIAS. None of them can contain "virtual".

Checked with a virtual and a real DualSense connected together. The virtual node ends up on seat9 with no user ACL, the real one keeps uaccess. scripts/wolf-input-diag.sh host reports the node as reachable by the desktop user before this and root-only after.


🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.

## 📋 Pull Request Information **Original PR:** https://github.com/games-on-whales/wolf/pull/473 **Author:** [@zerofltexx](https://github.com/zerofltexx) **Created:** 8/9/2026 **Status:** ✅ Merged **Merged:** 9/7/2026 **Merged by:** [@ABeltramo](https://github.com/ABeltramo) **Base:** `stable` ← **Head:** `fix/hidraw-seat-isolation` --- ### 📝 Commits (1) - [`00e6c85`](https://github.com/games-on-whales/wolf/commit/00e6c85e6d50d0616dbc040be762316e94159fcb) fix(input): match the DualSense hidraw node by its HID name ### 📊 Changes **1 file changed** (+4 additions, -2 deletions) <details> <summary>View changed files</summary> 📝 `85-wolf.rules` (+4 -2) </details> ### 📄 Description The rule for the hidraw node came in with the input ones and uses the same ATTRS{name}=="Wolf *virtual*" form. Before that there was no hidraw rule at all. A hidraw device has no name attribute in its parent chain though. name lives on the sibling input device, so ATTRS has nothing to walk up to and the rule does not reach the node. /dev/hidraw* for the virtual DualSense stays on ID_SEAT=seat0, so logind grants the desktop user a uaccess ACL on it. Steam on the host then reads the streamed pad and shows it connected with a battery level. The three input nodes are covered, so this is the one device still reachable. Match the parent's uevent instead. It carries the same string as HID_NAME, so the rule keeps using the "Wolf *virtual*" glob the input rules use. The uhid devpath is the simpler match but it is far too broad. BlueZ creates every Bluetooth HID device through uhid. On the hidraw node a real DualSense looks like the virtual one: bus 0005, vendor 054C, product 0CE6, driver playstation, same modalias. Only HID_NAME differs. With both paired at once a devpath match takes the real controller as well and strips its ACL, which breaks gyro, touchpad, LEDs and battery reporting for a real pad on the host. udev's * spans newlines, so the trailing glob can run past the end of the HID_NAME line. The next lines are HID_PHYS, HID_UNIQ and MODALIAS. None of them can contain "virtual". Checked with a virtual and a real DualSense connected together. The virtual node ends up on seat9 with no user ACL, the real one keeps uaccess. scripts/wolf-input-diag.sh host reports the node as reachable by the desktop user before this and root-only after. --- <sub>🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.</sub>
bsakaguchi 2026-10-15 13:00:58 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
games-on-whales/wolf#488
No description provided.