]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
gpiolib: sanitize the return value of gpio_chip::set_config()
authorBartosz Golaszewski <bartosz.golaszewski@linaro.org>
Mon, 10 Feb 2025 10:51:57 +0000 (11:51 +0100)
committerBartosz Golaszewski <bartosz.golaszewski@linaro.org>
Mon, 24 Feb 2025 08:58:58 +0000 (09:58 +0100)
The return value of the set_config() callback may be propagated to
user-space. If a bad driver returns a positive number, it may confuse
user programs. Tighten the API contract and check for positive numbers
returned by GPIO controllers.

Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
Link: https://lore.kernel.org/r/20250210-gpio-sanitize-retvals-v1-3-12ea88506cb2@linaro.org
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
drivers/gpio/gpiolib.c
include/linux/gpio/driver.h

index a98025b0ecf738f53a621160d2555c885238bc4f..67a735d5794278b465a503d92fd7320a32b4dc4c 100644 (file)
@@ -2593,6 +2593,9 @@ int gpio_do_set_config(struct gpio_desc *desc, unsigned long config)
                return -ENOTSUPP;
 
        ret = guard.gc->set_config(guard.gc, gpio_chip_hwgpio(desc), config);
+       if (ret > 0)
+               ret = -EBADE;
+
 #ifdef CONFIG_GPIO_CDEV
        /*
         * Special case - if we're setting debounce period, we need to store
index ce22c072337c4280f5f44920300529d4d18c1068..f2145e938b293cc412ac47cb0c857699c90accf0 100644 (file)
@@ -349,7 +349,8 @@ struct gpio_irq_chip {
  * @set: assigns output value for signal "offset"
  * @set_multiple: assigns output values for multiple signals defined by "mask"
  * @set_config: optional hook for all kinds of settings. Uses the same
- *     packed config format as generic pinconf.
+ *     packed config format as generic pinconf. Must return 0 on success and
+ *     a negative error number on failure.
  * @to_irq: optional hook supporting non-static gpiod_to_irq() mappings;
  *     implementation may not sleep
  * @dbg_show: optional routine to show contents in debugfs; default code