Fix memory leaks when failing to create a uinput device

For an invalid fd, or a failure to open the device, the pre-allocated uinput
device struct would leak.

We can drop the open_uinput() function now, since skipping to the error
handling means we'll return -errno anyway.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
This commit is contained in:
Peter Hutterer 2014-02-27 11:29:19 +10:00
parent f162f00f1d
commit fdf737494e

View file

@ -155,16 +155,6 @@ set_props(const struct libevdev *dev, int fd, struct uinput_user_dev *uidev)
return rc; return rc;
} }
static int
open_uinput(void)
{
int fd = open("/dev/uinput", O_RDWR|O_CLOEXEC);
if (fd < 0)
return -errno;
return fd;
}
LIBEVDEV_EXPORT int LIBEVDEV_EXPORT int
libevdev_uinput_get_fd(const struct libevdev_uinput *uinput_dev) libevdev_uinput_get_fd(const struct libevdev_uinput *uinput_dev)
{ {
@ -277,14 +267,15 @@ libevdev_uinput_create_from_device(const struct libevdev *dev, int fd, struct li
return -ENOMEM; return -ENOMEM;
if (fd == LIBEVDEV_UINPUT_OPEN_MANAGED) { if (fd == LIBEVDEV_UINPUT_OPEN_MANAGED) {
fd = open_uinput(); fd = open("/dev/uinput", O_RDWR|O_CLOEXEC);
if (fd < 0) if (fd < 0)
return fd; goto error;
new_device->fd_is_managed = 1; new_device->fd_is_managed = 1;
} else if (fd < 0) { } else if (fd < 0) {
log_bug("Invalid fd %d\n", fd); log_bug("Invalid fd %d\n", fd);
return -EBADF; errno = EBADF;
goto error;
} }
memset(&uidev, 0, sizeof(uidev)); memset(&uidev, 0, sizeof(uidev));