summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDevesh Jhunjhunwala <deveshj@codeaurora.org>2016-08-29 14:00:12 -0700
committerSubbaraman Narayanamurthy <subbaram@codeaurora.org>2016-10-12 20:03:40 -0700
commitb420097ef0be067b30a7ac9e90324e350ceab8cb (patch)
treeb04e1fd9fe36dc2262e45e73ee50b8b0a0801572
parent169fd1f5f59b20d9d7a2a3265c8db546854a8501 (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.c11
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);