uinput: fix race condition in uinput syspath check

In theory, the device could change between stat() call and open(), resulting
in us opening the new device. Change to open() first, then fstat() on the fd.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: David Herrmann <dh.herrmann@gmail.com>
This commit is contained in:
Peter Hutterer 2015-12-22 09:02:46 +10:00
parent 3c85fcb62f
commit 006f10cfcb

View file

@ -225,19 +225,19 @@ fetch_syspath_and_devnode(struct libevdev_uinput *uinput_dev)
continue;
}
if (stat(buf, &st) == -1)
continue;
/* created before UI_DEV_CREATE, or after it finished */
if (st.st_ctime < uinput_dev->ctime[0] ||
st.st_ctime > uinput_dev->ctime[1])
continue;
/* created within time frame */
fd = open(buf, O_RDONLY);
if (fd < 0)
continue;
/* created before UI_DEV_CREATE, or after it finished */
if (fstat(fd, &st) == -1 ||
st.st_ctime < uinput_dev->ctime[0] ||
st.st_ctime > uinput_dev->ctime[1]) {
close(fd);
continue;
}
len = read(fd, buf, sizeof(buf));
close(fd);
if (len <= 0)