Commit e2144827 authored by Lars-Peter Clausen's avatar Lars-Peter Clausen Committed by Greg Kroah-Hartman

gpio: GPIO_GET_LINEHANDLE_IOCTL: Reject invalid line flags

commit e3e847c7 upstream.

The GPIO_GET_LINEHANDLE_IOCTL currently ignores unknown or undefined
linehandle flags. From a backwards and forwards compatibility viewpoint it
is highly desirable to reject unknown flags though.

On one hand an application that is using newer flags and is running on
an older kernel has no way to detect if the new flags were handled
correctly if they are silently discarded.

On the other hand an application that (accidentally) passes undefined flags
will run fine on an older kernel, but may break on a newer kernel when
these flags get defined.

Ensure that requests that have undefined flags set are rejected with an
error, rather than silently discarding the undefined flags.

Fixes: d7c51b47 ("gpio: userspace ABI for reading/writing GPIO lines")
Signed-off-by: default avatarLars-Peter Clausen <lars@metafoo.de>
Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent c0699405
...@@ -331,6 +331,13 @@ struct linehandle_state { ...@@ -331,6 +331,13 @@ struct linehandle_state {
u32 numdescs; u32 numdescs;
}; };
#define GPIOHANDLE_REQUEST_VALID_FLAGS \
(GPIOHANDLE_REQUEST_INPUT | \
GPIOHANDLE_REQUEST_OUTPUT | \
GPIOHANDLE_REQUEST_ACTIVE_LOW | \
GPIOHANDLE_REQUEST_OPEN_DRAIN | \
GPIOHANDLE_REQUEST_OPEN_SOURCE)
static long linehandle_ioctl(struct file *filep, unsigned int cmd, static long linehandle_ioctl(struct file *filep, unsigned int cmd,
unsigned long arg) unsigned long arg)
{ {
...@@ -449,6 +456,12 @@ static int linehandle_create(struct gpio_device *gdev, void __user *ip) ...@@ -449,6 +456,12 @@ static int linehandle_create(struct gpio_device *gdev, void __user *ip)
goto out_free_descs; goto out_free_descs;
} }
/* Return an error if a unknown flag is set */
if (lflags & ~GPIOHANDLE_REQUEST_VALID_FLAGS) {
ret = -EINVAL;
goto out_free_descs;
}
desc = &gdev->descs[offset]; desc = &gdev->descs[offset];
ret = gpiod_request(desc, lh->label); ret = gpiod_request(desc, lh->label);
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