• Bartosz Golaszewski's avatar
    gpiolib: cdev: fix NULL-pointer dereferences · 533aae7c
    Bartosz Golaszewski authored
    There are several places where we can crash the kernel by requesting
    lines, unbinding the GPIO device, then calling any of the system calls
    relevant to the GPIO character device's annonymous file descriptors:
    ioctl(), read(), poll().
    
    While I observed it with the GPIO simulator, it will also happen for any
    of the GPIO devices that can be hot-unplugged - for instance any HID GPIO
    expander (e.g. CP2112).
    
    This affects both v1 and v2 uAPI.
    
    This fixes it partially by checking if gdev->chip is not NULL but it
    doesn't entirely remedy the situation as we still have a race condition
    in which another thread can remove the device after the check.
    
    Fixes: d7c51b47 ("gpio: userspace ABI for reading/writing GPIO lines")
    Fixes: 3c0d9c63 ("gpiolib: cdev: support GPIO_V2_GET_LINE_IOCTL and GPIO_V2_LINE_GET_VALUES_IOCTL")
    Fixes: aad95584 ("gpiolib: cdev: support GPIO_V2_GET_LINEINFO_IOCTL and GPIO_V2_GET_LINEINFO_WATCH_IOCTL")
    Fixes: a54756cb ("gpiolib: cdev: support GPIO_V2_LINE_SET_CONFIG_IOCTL")
    Fixes: 7b8e00d9 ("gpiolib: cdev: support GPIO_V2_LINE_SET_VALUES_IOCTL")
    Signed-off-by: default avatarBartosz Golaszewski <bartosz.golaszewski@linaro.org>
    Reviewed-by: default avatarAndy Shevchenko <andriy.shevchenko@linux.intel.com>
    Reviewed-by: default avatarLinus Walleij <linus.walleij@linaro.org>
    533aae7c
gpiolib-cdev.c 65.7 KB