From b07072e6a27253b5eb7d21049a108449920b4c50 Mon Sep 17 00:00:00 2001 From: Bruno Prémont Date: Mon, 30 Jul 2012 21:38:50 +0200 Subject: HID: picoLCD: prevent NULL pointer dereference on unplug MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ 679.807480] BUG: unable to handle kernel NULL pointer dereference at 00000074 [ 679.814457] IP: [] picolcd_led_set_brightness+0x1f/0xb0 [hid_picolcd] [ 679.814457] *pde = 00000000 [ 679.814457] Oops: 0000 [#1] [ 679.814457] Modules linked in: hid_picolcd fb_sys_fops sysimgblt sysfillrect syscopyarea drm_kms_helper nfs lockd nfs_acl sunrpc [last unloaded: hid_picolcd] [ 679.814457] [ 679.814457] Pid: 272, comm: khubd Not tainted 3.5.0-jupiter-00006-g463a4c0 #1 NVIDIA Corporation. nFORCE-MCP/MS-6373 [ 679.814457] EIP: 0060:[] EFLAGS: 00010246 CPU: 0 [ 679.814457] EIP is at picolcd_led_set_brightness+0x1f/0xb0 [hid_picolcd] [ 679.814457] EAX: 00000000 EBX: d9f0c4e0 ECX: 00000000 EDX: 00000000 [ 679.814457] ESI: 00000000 EDI: dd6b79c0 EBP: dd4f7d90 ESP: dd4f7d80 [ 679.814457] DS: 007b ES: 007b FS: 0000 GS: 00e0 SS: 0068 [ 679.814457] CR0: 8005003b CR2: 00000074 CR3: 1d74e000 CR4: 000007d0 [ 679.814457] DR0: 00000000 DR1: 00000000 DR2: 00000000 DR3: 00000000 [ 679.814457] DR6: ffff0ff0 DR7: 00000400 [ 679.814457] Process khubd (pid: 272, ti=dd4f6000 task=dd442470 task.ti=dd4f6000) [ 679.814457] Stack: [ 679.814457] 1d6c3300 d9f0c4e0 d9f0c4e0 dd6b79c0 dd4f7da0 c132912a 00000000 d9f0c4e0 [ 679.814457] dd4f7dac c132935d 00000000 dd4f7dc0 de93b847 dd6b79c0 00000282 c700ecc8 [ 679.814457] dd4f7ddc de93924f 00000004 c700ecc8 c700e060 c700ecbc c15ee300 dd4f7dec [ 679.814457] Call Trace: [ 679.814457] [] led_brightness_set+0x2a/0x30 [ 679.814457] [] led_classdev_unregister+0xd/0x50 [ 679.814457] [] picolcd_exit_leds+0x27/0x40 [hid_picolcd] [ 679.814457] [] picolcd_remove+0xbf/0x110 [hid_picolcd] [ 679.814457] [] hid_device_remove+0x3d/0x80 [ 679.814457] [] __device_release_driver+0x56/0xa0 [ 679.814457] [] device_release_driver+0x20/0x30 [ 679.814457] [] bus_remove_device+0x9f/0xc0 [ 679.814457] [] device_del+0xdd/0x150 [ 679.814457] [] hid_destroy_device+0x25/0x60 [ 679.814457] [] usbhid_disconnect+0x1b/0x40 [ 679.814457] [] usb_unbind_interface+0x46/0x170 [ 679.814457] [] __device_release_driver+0x56/0xa0 [ 679.814457] [] device_release_driver+0x20/0x30 [ 679.814457] [] bus_remove_device+0x9f/0xc0 [ 679.814457] [] device_del+0xdd/0x150 [ 679.814457] [] usb_disable_device+0x85/0x1a0 [ 679.814457] [] ? __cond_resched+0x16/0x30 [ 679.814457] [] usb_disconnect+0x80/0xf0 [ 679.814457] [] hub_thread+0x3df/0x1030 [ 679.814457] [] ? wake_up_bit+0x30/0x30 [ 679.814457] [] ? usb_remote_wakeup+0x40/0x40 [ 679.814457] [] kthread+0x74/0x80 [ 679.814457] [] ? flush_kthread_worker+0x90/0x90 [ 679.814457] [] kernel_thread_helper+0x6/0xd [ 679.814457] Code: e0 25 00 e0 ff ff ff 48 14 eb 99 90 55 89 e5 83 ec 10 89 5d f4 89 75 f8 89 c3 89 7d fc 8b 40 1c 89 d6 8b 00 e8 13 89 95 e2 31 c9 <39> 5c 88 74 74 13 41 83 f9 08 75 f4 8b 5d f4 8b 75 f8 8b 7d fc [ 679.814457] EIP: [] picolcd_led_set_brightness+0x1f/0xb0 [hid_picolcd] SS:ESP 0068:dd4f7d80 [ 679.814457] CR2: 0000000000000074 [ 680.116438] ---[ end trace 6f0d9d63bff280ff ]--- Signed-off-by: Bruno Prémont Signed-off-by: Jiri Kosina --- drivers/hid/hid-picolcd_leds.c | 2 ++ 1 file changed, 2 insertions(+) (limited to 'drivers') diff --git a/drivers/hid/hid-picolcd_leds.c b/drivers/hid/hid-picolcd_leds.c index 9249c068a48..5573cd8b240 100644 --- a/drivers/hid/hid-picolcd_leds.c +++ b/drivers/hid/hid-picolcd_leds.c @@ -69,6 +69,8 @@ static void picolcd_led_set_brightness(struct led_classdev *led_cdev, dev = led_cdev->dev->parent; hdev = container_of(dev, struct hid_device, dev); data = hid_get_drvdata(hdev); + if (!data) + return; for (i = 0; i < 8; i++) { if (led_cdev != data->led[i]) continue; -- cgit v1.2.3-70-g09d2