| From 6ae645d5fa385f3787bf1723639cd907fe5865e7 Mon Sep 17 00:00:00 2001 |
| From: Marek Szyprowski <m.szyprowski@samsung.com> |
| Date: Mon, 9 May 2016 09:31:47 -0700 |
| Subject: Input: max8997-haptic - fix NULL pointer dereference |
| |
| From: Marek Szyprowski <m.szyprowski@samsung.com> |
| |
| commit 6ae645d5fa385f3787bf1723639cd907fe5865e7 upstream. |
| |
| NULL pointer derefence happens when booting with DTB because the |
| platform data for haptic device is not set in supplied data from parent |
| MFD device. |
| |
| The MFD device creates only platform data (from Device Tree) for itself, |
| not for haptic child. |
| |
| Unable to handle kernel NULL pointer dereference at virtual address 0000009c |
| pgd = c0004000 |
| [0000009c] *pgd=00000000 |
| Internal error: Oops: 5 [#1] PREEMPT SMP ARM |
| (max8997_haptic_probe) from [<c03f9cec>] (platform_drv_probe+0x4c/0xb0) |
| (platform_drv_probe) from [<c03f8440>] (driver_probe_device+0x214/0x2c0) |
| (driver_probe_device) from [<c03f8598>] (__driver_attach+0xac/0xb0) |
| (__driver_attach) from [<c03f67ac>] (bus_for_each_dev+0x68/0x9c) |
| (bus_for_each_dev) from [<c03f7a38>] (bus_add_driver+0x1a0/0x218) |
| (bus_add_driver) from [<c03f8db0>] (driver_register+0x78/0xf8) |
| (driver_register) from [<c0101774>] (do_one_initcall+0x90/0x1d8) |
| (do_one_initcall) from [<c0a00dbc>] (kernel_init_freeable+0x15c/0x1fc) |
| (kernel_init_freeable) from [<c06bb5b4>] (kernel_init+0x8/0x114) |
| (kernel_init) from [<c0107938>] (ret_from_fork+0x14/0x3c) |
| |
| Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com> |
| Fixes: 104594b01ce7 ("Input: add driver support for MAX8997-haptic") |
| [k.kozlowski: Write commit message, add CC-stable] |
| Signed-off-by: Krzysztof Kozlowski <k.kozlowski@samsung.com> |
| Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/input/misc/max8997_haptic.c | 6 ++++-- |
| 1 file changed, 4 insertions(+), 2 deletions(-) |
| |
| --- a/drivers/input/misc/max8997_haptic.c |
| +++ b/drivers/input/misc/max8997_haptic.c |
| @@ -255,12 +255,14 @@ static int max8997_haptic_probe(struct p |
| struct max8997_dev *iodev = dev_get_drvdata(pdev->dev.parent); |
| const struct max8997_platform_data *pdata = |
| dev_get_platdata(iodev->dev); |
| - const struct max8997_haptic_platform_data *haptic_pdata = |
| - pdata->haptic_pdata; |
| + const struct max8997_haptic_platform_data *haptic_pdata = NULL; |
| struct max8997_haptic *chip; |
| struct input_dev *input_dev; |
| int error; |
| |
| + if (pdata) |
| + haptic_pdata = pdata->haptic_pdata; |
| + |
| if (!haptic_pdata) { |
| dev_err(&pdev->dev, "no haptic platform data\n"); |
| return -EINVAL; |