3.16.70-rc1 review patch.  If anyone has any objections, please let me know.

------------------

From: Michal Kazior <mic...@plume.com>

commit 5ddb0869bfc1bca6cfc592c74c64a026f936638c upstream.

I've stumbled upon a kernel crash and the logs
pointed me towards the lp5562 driver:

> <4>[306013.841294] lp5562 0-0030: Direct firmware load for lp5562 failed with 
> error -2
> <4>[306013.894990] lp5562 0-0030: Falling back to user helper
> ...
> <3>[306073.924886] lp5562 0-0030: firmware request failed
> <1>[306073.939456] Unable to handle kernel NULL pointer dereference at 
> virtual address 00000000
> <4>[306074.251011] PC is at _raw_spin_lock+0x1c/0x58
> <4>[306074.255539] LR is at release_firmware+0x6c/0x138
> ...

After taking a look I noticed firmware_release()
could be called with either NULL or a dangling
pointer.

Fixes: 10c06d178df11 ("leds-lp55xx: support firmware interface")
Signed-off-by: Michal Kazior <mic...@plume.com>
Signed-off-by: Jacek Anaszewski <jacek.anaszew...@gmail.com>
Signed-off-by: Ben Hutchings <b...@decadent.org.uk>
---
 drivers/leds/leds-lp55xx-common.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

--- a/drivers/leds/leds-lp55xx-common.c
+++ b/drivers/leds/leds-lp55xx-common.c
@@ -214,7 +214,7 @@ static void lp55xx_firmware_loaded(const
 
        if (!fw) {
                dev_err(dev, "firmware request failed\n");
-               goto out;
+               return;
        }
 
        /* handling firmware data is chip dependent */
@@ -227,9 +227,9 @@ static void lp55xx_firmware_loaded(const
 
        mutex_unlock(&chip->lock);
 
-out:
        /* firmware should be released for other channel use */
        release_firmware(chip->fw);
+       chip->fw = NULL;
 }
 
 static int lp55xx_request_firmware(struct lp55xx_chip *chip)

Reply via email to