gpiolib: improve the robustness of watch/unwatch ioctl()
PATCH 1/1 gpiolib: improve the robustness of watch/unwatch ioctl()
From: Bartosz Golaszewski <[email protected]>
This makes the new ioctl() a bit more robust - we now check if a line is already being watched and return -EBUSY if the user-space tries to start watching it again. Same for unwatch - return -EBUSY if user-space tries to unwatch a line that's not being watched.
--- drivers/gpio/gpiolib.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-)
drivers/gpio/gpiolib.c +14 -2
@@ -1227,6 +1227,7 @@ static long gpio_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)void __user *ip = (void __user *)arg;struct gpio_desc *desc;__u32 offset; +int hwgpio;/* We fail any subsequent ioctl():s when the chip is gone */ if (!gc)
@@ -1259,13 +1260,19 @@ static long gpio_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)if (IS_ERR (desc))return PTR_ERR (desc); + hwgpio =gpio_chip_hwgpio (desc); + +if (cmd ==GPIO_GET_LINEINFO_WATCH_IOCTL && +test_bit (hwgpio, priv->watched_lines)) +return -EBUSY ; +gpio_desc_to_lineinfo (desc, &lineinfo);if (copy_to_user (ip, &lineinfo,sizeof (lineinfo)))return -EFAULT ;if (cmd ==GPIO_GET_LINEINFO_WATCH_IOCTL ) -set_bit (gpio_chip_hwgpio (desc), priv->watched_lines); +set_bit (hwgpio, priv->watched_lines);return 0 ; }else if (cmd ==GPIO_GET_LINEHANDLE_IOCTL ) {
@@ -1280,7 +1287,12 @@ static long gpio_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)if (IS_ERR (desc))return PTR_ERR (desc); -clear_bit (gpio_chip_hwgpio (desc), priv->watched_lines); + hwgpio =gpio_chip_hwgpio (desc); + +if (!test_bit (hwgpio, priv->watched_lines)) +return -EBUSY ; + +clear_bit (hwgpio, priv->watched_lines);return 0 ; }return -EINVAL ;
Signature · 1 line
2.25.0
Quoted 9 lines · Bartosz Golaszewski
From: Bartosz Golaszewski <[email protected]>
This makes the new
ioctl()a bit more robust - we now check if a line is already being watched and return-EBUSYif the user-space tries to start watching it again. Same for unwatch - return-EBUSYif user-space tries to unwatch a line that's not being watched.Fixes 51c1064e82e7 ("gpiolib: add new ioctl() for monitoring changes in line info")Signed-off-by Bartosz Golaszewski <[email protected]>
I expect that you send me a pull request with some GPIO fixes when you feel you have some stuff including this I should send upstream, thanks!
Yours,
Linus Walleij