Re: [PATCH] iio: adc: exynos-adc: Fix NULL pointer exception on unbind

From: Jonathan Cameron
Date: Sat Feb 09 2019 - 11:47:13 EST


On Sat, 9 Feb 2019 00:39:27 +0100
Krzysztof Kozlowski <krzk@xxxxxxxxxx> wrote:

> Fix NULL pointer exception on device unbind when device tree does not
> contain "has-touchscreen" property. In such case the input device is
> not registered so it should not be unregistered.
>
> $ echo "12d10000.adc" > /sys/bus/platform/drivers/exynos-adc/unbind
>
> Unable to handle kernel NULL pointer dereference at virtual address 00000474
> ...
> (input_unregister_device) from [<c0772060>] (exynos_adc_remove+0x20/0x80)
> (exynos_adc_remove) from [<c0587d5c>] (platform_drv_remove+0x20/0x40)
> (platform_drv_remove) from [<c05860f0>] (device_release_driver_internal+0xdc/0x1ac)
> (device_release_driver_internal) from [<c0583ecc>] (unbind_store+0x60/0xd4)
> (unbind_store) from [<c031b89c>] (kernfs_fop_write+0x100/0x1e0)
> (kernfs_fop_write) from [<c029709c>] (__vfs_write+0x2c/0x17c)
> (__vfs_write) from [<c0297374>] (vfs_write+0xa4/0x184)
> (vfs_write) from [<c0297594>] (ksys_write+0x4c/0xac)
> (ksys_write) from [<c0101000>] (ret_fast_syscall+0x0/0x28)
>
> Fixes: 2bb8ad9b44c5 ("iio: exynos-adc: add experimental touchscreen support")
> Cc: <stable@xxxxxxxxxxxxxxx>
> Signed-off-by: Krzysztof Kozlowski <krzk@xxxxxxxxxx>
Given we have had this one for a little while and are late in the
cycle I'm going to queue it up for the coming merge window.

Applied to the togreg branch of iio.git and pushed out as testing
for the autobuilders to play with it.

Thanks,

Jonathan
> ---
> drivers/iio/adc/exynos_adc.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/drivers/iio/adc/exynos_adc.c b/drivers/iio/adc/exynos_adc.c
> index fa2d2b5767f3..41da522fc673 100644
> --- a/drivers/iio/adc/exynos_adc.c
> +++ b/drivers/iio/adc/exynos_adc.c
> @@ -929,7 +929,7 @@ static int exynos_adc_remove(struct platform_device *pdev)
> struct iio_dev *indio_dev = platform_get_drvdata(pdev);
> struct exynos_adc *info = iio_priv(indio_dev);
>
> - if (IS_REACHABLE(CONFIG_INPUT)) {
> + if (IS_REACHABLE(CONFIG_INPUT) && info->input) {
> free_irq(info->tsirq, info);
> input_unregister_device(info->input);
> }