summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Hutterer <peter.hutterer@who-t.net>2014-08-22 11:42:10 +1000
committerPeter Hutterer <peter.hutterer@who-t.net>2014-08-22 11:50:13 +1000
commit53958c56cd486378800fe2db247fd7923a73cf6a (patch)
tree481e6a314e8ddb7cfc5522e04a5a761768f1dfa2
parente4c315fc160355958c8db98c0b762e9d2d3bbdb9 (diff)
downloadlibevdev-53958c56cd486378800fe2db247fd7923a73cf6a.tar.gz
uinput: close the managed fd on error
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>
-rw-r--r--libevdev/libevdev-uinput.c3
1 files changed, 3 insertions, 0 deletions
diff --git a/libevdev/libevdev-uinput.c b/libevdev/libevdev-uinput.c
index c1b20e0..ea2b025 100644
--- a/libevdev/libevdev-uinput.c
+++ b/libevdev/libevdev-uinput.c
@@ -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;
}