mirror of
https://gitlab.freedesktop.org/libinput/libinput.git
synced 2026-05-07 13:08:04 +02:00
Merge branch 'trust-fd' into 'main'
evdev: trust fds provided by a seat manager Closes #1280 See merge request libinput/libinput!1471
This commit is contained in:
commit
2e6eb3cc19
2 changed files with 21 additions and 11 deletions
18
src/evdev.c
18
src/evdev.c
|
|
@ -2095,23 +2095,21 @@ static bool
|
||||||
evdev_device_have_same_syspath(struct udev_device *udev_device, int fd)
|
evdev_device_have_same_syspath(struct udev_device *udev_device, int fd)
|
||||||
{
|
{
|
||||||
struct udev *udev = udev_device_get_udev(udev_device);
|
struct udev *udev = udev_device_get_udev(udev_device);
|
||||||
struct udev_device *udev_device_new = NULL;
|
_unref_(udev_device) *udev_device_new = NULL;
|
||||||
struct stat st;
|
struct stat st;
|
||||||
bool rc = false;
|
|
||||||
|
|
||||||
if (fstat(fd, &st) < 0)
|
if (fstat(fd, &st) < 0)
|
||||||
goto out;
|
return false;
|
||||||
|
|
||||||
udev_device_new = udev_device_new_from_devnum(udev, 'c', st.st_rdev);
|
udev_device_new = udev_device_new_from_devnum(udev, 'c', st.st_rdev);
|
||||||
|
/* In a jail/container where devfs doesn't expose the device, we
|
||||||
|
* cannot verify the syspath. Trust the fd provider (e.g. seatd).
|
||||||
|
*/
|
||||||
if (!udev_device_new)
|
if (!udev_device_new)
|
||||||
goto out;
|
return true;
|
||||||
|
|
||||||
rc = streq(udev_device_get_syspath(udev_device_new),
|
return streq(udev_device_get_syspath(udev_device_new),
|
||||||
udev_device_get_syspath(udev_device));
|
udev_device_get_syspath(udev_device));
|
||||||
out:
|
|
||||||
if (udev_device_new)
|
|
||||||
udev_device_unref(udev_device_new);
|
|
||||||
return rc;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
|
|
|
||||||
|
|
@ -332,8 +332,20 @@ udev_device_from_devnode(struct libinput *libinput,
|
||||||
struct stat st;
|
struct stat st;
|
||||||
size_t count = 0;
|
size_t count = 0;
|
||||||
|
|
||||||
if (stat(devnode, &st) < 0)
|
if (stat(devnode, &st) < 0) {
|
||||||
|
#ifdef __FreeBSD__
|
||||||
|
/*
|
||||||
|
* If stat fails (e.g. device node not visible in a jail), fall
|
||||||
|
* back to creating a udev device directly from the devnode
|
||||||
|
* path. This works in FreeBSD because libudev-devd constructs
|
||||||
|
* devices using the information exposed by the kernel through
|
||||||
|
* the sysctl interface.
|
||||||
|
*/
|
||||||
|
return udev_device_new_from_syspath(udev, devnode);
|
||||||
|
#else
|
||||||
return NULL;
|
return NULL;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
dev = udev_device_new_from_devnum(udev, 'c', st.st_rdev);
|
dev = udev_device_new_from_devnum(udev, 'c', st.st_rdev);
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue