diff options
| author | Devesh Jhunjhunwala <deveshj@codeaurora.org> | 2016-08-29 14:00:12 -0700 |
|---|---|---|
| committer | Subbaraman Narayanamurthy <subbaram@codeaurora.org> | 2016-10-12 20:03:40 -0700 |
| commit | b420097ef0be067b30a7ac9e90324e350ceab8cb (patch) | |
| tree | b04e1fd9fe36dc2262e45e73ee50b8b0a0801572 | |
| parent | 169fd1f5f59b20d9d7a2a3265c8db546854a8501 (diff) | |
leds: qpnp-flash-v2: Fix possible NULL pointer dereference
Update the flash_led_brightness_set callback to gracefully handle
invalid led_class device, and being called before driver probe is
complete.
CRs-Fixed: 1060705
Change-Id: Ice714c1fad1d202d05de6ecaf6d1d1ec17a04c15
Signed-off-by: Devesh Jhunjhunwala <deveshj@codeaurora.org>
| -rw-r--r-- | drivers/leds/leds-qpnp-flash-v2.c | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/drivers/leds/leds-qpnp-flash-v2.c b/drivers/leds/leds-qpnp-flash-v2.c index 626c0de1d770..bc94dff08d21 100644 --- a/drivers/leds/leds-qpnp-flash-v2.c +++ b/drivers/leds/leds-qpnp-flash-v2.c @@ -1013,17 +1013,24 @@ static void qpnp_flash_led_brightness_set(struct led_classdev *led_cdev, { struct flash_node_data *fnode = NULL; struct flash_switch_data *snode = NULL; - struct qpnp_flash_led *led = dev_get_drvdata(&fnode->pdev->dev); + struct qpnp_flash_led *led = NULL; int rc; if (!strncmp(led_cdev->name, "led:switch", strlen("led:switch"))) { snode = container_of(led_cdev, struct flash_switch_data, cdev); led = dev_get_drvdata(&snode->pdev->dev); - } else { + } else if (!strncmp(led_cdev->name, "led:flash", strlen("led:flash")) || + !strncmp(led_cdev->name, "led:torch", + strlen("led:torch"))) { fnode = container_of(led_cdev, struct flash_node_data, cdev); led = dev_get_drvdata(&fnode->pdev->dev); } + if (!led) { + pr_err("Failed to get flash driver data\n"); + return; + } + spin_lock(&led->lock); if (snode) { rc = qpnp_flash_led_switch_set(snode, value > 0); |
