From b2ac13f498fb217194d6afe836981411bf14158c Mon Sep 17 00:00:00 2001 From: Uwe Kleine-König Date: Thu, 21 Sep 2017 22:44:55 +0200 Subject: gpiolib: check validity for gpio_info in *_active() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit gpio_set_active, gpio_is_active and gpio_direction_active are public functions, accordingly there should be error checking. If an invalid gpio number is given to these functions without checking gpio_adjust_value is called with gi == NULL which then dereferences this pointer. Signed-off-by: Uwe Kleine-König Signed-off-by: Sascha Hauer --- drivers/gpio/gpiolib.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c index 67d771bae3..b83a27de7d 100644 --- a/drivers/gpio/gpiolib.c +++ b/drivers/gpio/gpiolib.c @@ -204,6 +204,10 @@ EXPORT_SYMBOL(gpio_set_value); void gpio_set_active(unsigned gpio, bool value) { struct gpio_info *gi = gpio_to_desc(gpio); + + if (!gi) + return; + gpio_set_value(gpio, gpio_adjust_value(gi, value)); } EXPORT_SYMBOL(gpio_set_active); @@ -229,6 +233,10 @@ EXPORT_SYMBOL(gpio_get_value); int gpio_is_active(unsigned gpio) { struct gpio_info *gi = gpio_to_desc(gpio); + + if (!gi) + return -ENODEV; + return gpio_adjust_value(gi, gpio_get_value(gpio)); } EXPORT_SYMBOL(gpio_is_active); @@ -255,6 +263,10 @@ EXPORT_SYMBOL(gpio_direction_output); int gpio_direction_active(unsigned gpio, bool value) { struct gpio_info *gi = gpio_to_desc(gpio); + + if (!gi) + return -ENODEV; + return gpio_direction_output(gpio, gpio_adjust_value(gi, value)); } EXPORT_SYMBOL(gpio_direction_active); -- cgit v1.2.3