mirror of
https://gitlab.freedesktop.org/libevdev/libevdev.git
synced 2026-04-24 19:40:42 +02:00
Reset the struct on set_fd
libevdev_set_fd may fail at a number of points. If it does, it errors out but does nothing
otherwise. Thus, a client may call set_fd again for the same struct but on a different fd and have
it succeed. Depending on when set_fd bailed out the first time, some fields may already be set.
Thus, reset the whole struct at set_fd time to make sure we're nulled out appropriately.
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: David Herrmann <dh.herrmann@gmail.com>
(cherry picked from commit b15e5987b3)
This commit is contained in:
parent
6801ad6832
commit
f7e3bbbb24
1 changed files with 19 additions and 7 deletions
|
|
@ -109,19 +109,27 @@ log_msg(enum libevdev_log_priority priority,
|
||||||
va_end(args);
|
va_end(args);
|
||||||
}
|
}
|
||||||
|
|
||||||
LIBEVDEV_EXPORT struct libevdev*
|
static void
|
||||||
libevdev_new(void)
|
libevdev_reset(struct libevdev *dev)
|
||||||
{
|
{
|
||||||
struct libevdev *dev;
|
memset(dev, 0, sizeof(*dev));
|
||||||
|
|
||||||
dev = calloc(1, sizeof(*dev));
|
|
||||||
if (!dev)
|
|
||||||
return NULL;
|
|
||||||
dev->fd = -1;
|
dev->fd = -1;
|
||||||
dev->num_slots = -1;
|
dev->num_slots = -1;
|
||||||
dev->current_slot = -1;
|
dev->current_slot = -1;
|
||||||
dev->grabbed = LIBEVDEV_UNGRAB;
|
dev->grabbed = LIBEVDEV_UNGRAB;
|
||||||
dev->sync_state = SYNC_NONE;
|
dev->sync_state = SYNC_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
LIBEVDEV_EXPORT struct libevdev*
|
||||||
|
libevdev_new(void)
|
||||||
|
{
|
||||||
|
struct libevdev *dev;
|
||||||
|
|
||||||
|
dev = malloc(sizeof(*dev));
|
||||||
|
if (!dev)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
libevdev_reset(dev);
|
||||||
|
|
||||||
return dev;
|
return dev;
|
||||||
}
|
}
|
||||||
|
|
@ -209,6 +217,8 @@ libevdev_set_fd(struct libevdev* dev, int fd)
|
||||||
return -EBADF;
|
return -EBADF;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
libevdev_reset(dev);
|
||||||
|
|
||||||
rc = ioctl(fd, EVIOCGBIT(0, sizeof(dev->bits)), dev->bits);
|
rc = ioctl(fd, EVIOCGBIT(0, sizeof(dev->bits)), dev->bits);
|
||||||
if (rc < 0)
|
if (rc < 0)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
@ -352,6 +362,8 @@ libevdev_set_fd(struct libevdev* dev, int fd)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
out:
|
out:
|
||||||
|
if (rc)
|
||||||
|
libevdev_reset(dev);
|
||||||
return rc ? -errno : 0;
|
return rc ? -errno : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue