uinput: close the managed fd on error
authorPeter Hutterer <peter.hutterer@who-t.net>
Fri, 22 Aug 2014 01:42:10 +0000 (11:42 +1000)
committerPeter Hutterer <peter.hutterer@who-t.net>
Fri, 22 Aug 2014 01:50:13 +0000 (11:50 +1000)
Using LIBEVDEV_UINPUT_OPEN_MANAGED can leak the fd if an error occurs after
opening it.

Found by Coverity.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
libevdev/libevdev-uinput.c

index c1b20e0dba77ab16bd776430edb029d5f9ea9a3f..ea2b025f851154f915f5d57dab4fb89501fe1303 100644 (file)
@@ -279,6 +279,7 @@ libevdev_uinput_create_from_device(const struct libevdev *dev, int fd, struct li
        int rc;
        struct uinput_user_dev uidev;
        struct libevdev_uinput *new_device;
+       int close_fd_on_error = (fd == LIBEVDEV_UINPUT_OPEN_MANAGED);
 
        new_device = alloc_uinput_device(libevdev_get_name(dev));
        if (!new_device)
@@ -346,6 +347,8 @@ libevdev_uinput_create_from_device(const struct libevdev *dev, int fd, struct li
 error:
        rc = -errno;
        libevdev_uinput_destroy(new_device);
+       if (fd != -1 && close_fd_on_error)
+               close(fd);
        return rc;
 }