Commit aefde297 authored by Linus Walleij's avatar Linus Walleij

Merge tag 'gpio-v5.4-fixes-for-linus' of...

Merge tag 'gpio-v5.4-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/brgl/linux into fixes

gpio: fixes for v5.4

- fix a memory leak in gpio-mockup
- fix two flag validation bugs in gpiolib's character device ioctl()'s
parents f74c2bb9 5ca2f54b
...@@ -309,6 +309,7 @@ static const struct file_operations gpio_mockup_debugfs_ops = { ...@@ -309,6 +309,7 @@ static const struct file_operations gpio_mockup_debugfs_ops = {
.read = gpio_mockup_debugfs_read, .read = gpio_mockup_debugfs_read,
.write = gpio_mockup_debugfs_write, .write = gpio_mockup_debugfs_write,
.llseek = no_llseek, .llseek = no_llseek,
.release = single_release,
}; };
static void gpio_mockup_debugfs_setup(struct device *dev, static void gpio_mockup_debugfs_setup(struct device *dev,
......
...@@ -535,6 +535,14 @@ static int linehandle_create(struct gpio_device *gdev, void __user *ip) ...@@ -535,6 +535,14 @@ static int linehandle_create(struct gpio_device *gdev, void __user *ip)
if (lflags & ~GPIOHANDLE_REQUEST_VALID_FLAGS) if (lflags & ~GPIOHANDLE_REQUEST_VALID_FLAGS)
return -EINVAL; return -EINVAL;
/*
* Do not allow both INPUT & OUTPUT flags to be set as they are
* contradictory.
*/
if ((lflags & GPIOHANDLE_REQUEST_INPUT) &&
(lflags & GPIOHANDLE_REQUEST_OUTPUT))
return -EINVAL;
/* /*
* Do not allow OPEN_SOURCE & OPEN_DRAIN flags in a single request. If * Do not allow OPEN_SOURCE & OPEN_DRAIN flags in a single request. If
* the hardware actually supports enabling both at the same time the * the hardware actually supports enabling both at the same time the
...@@ -926,7 +934,9 @@ static int lineevent_create(struct gpio_device *gdev, void __user *ip) ...@@ -926,7 +934,9 @@ static int lineevent_create(struct gpio_device *gdev, void __user *ip)
} }
/* This is just wrong: we don't look for events on output lines */ /* This is just wrong: we don't look for events on output lines */
if (lflags & GPIOHANDLE_REQUEST_OUTPUT) { if ((lflags & GPIOHANDLE_REQUEST_OUTPUT) ||
(lflags & GPIOHANDLE_REQUEST_OPEN_DRAIN) ||
(lflags & GPIOHANDLE_REQUEST_OPEN_SOURCE)) {
ret = -EINVAL; ret = -EINVAL;
goto out_free_label; goto out_free_label;
} }
...@@ -940,10 +950,6 @@ static int lineevent_create(struct gpio_device *gdev, void __user *ip) ...@@ -940,10 +950,6 @@ static int lineevent_create(struct gpio_device *gdev, void __user *ip)
if (lflags & GPIOHANDLE_REQUEST_ACTIVE_LOW) if (lflags & GPIOHANDLE_REQUEST_ACTIVE_LOW)
set_bit(FLAG_ACTIVE_LOW, &desc->flags); set_bit(FLAG_ACTIVE_LOW, &desc->flags);
if (lflags & GPIOHANDLE_REQUEST_OPEN_DRAIN)
set_bit(FLAG_OPEN_DRAIN, &desc->flags);
if (lflags & GPIOHANDLE_REQUEST_OPEN_SOURCE)
set_bit(FLAG_OPEN_SOURCE, &desc->flags);
ret = gpiod_direction_input(desc); ret = gpiod_direction_input(desc);
if (ret) if (ret)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment