Просмотр исходного кода

HID: hiddev: fix potential use-after-free

Commit 6cb4b040795 ("HID: hiddev: fix race between hiddev_disconnect
and hiddev_release") made it possible to access hiddev (for unlocking
the existance mutex) once hiddev has been kfreed.

Change the order so that this can not happen (always unlock the mutex first,
it is needed only to protect access to ->exist and ->open).

Signed-off-by: Jiri Kosina <jkosina@suse.cz>
Jiri Kosina 14 лет назад
Родитель
Сommit
7f77897ef2
1 измененных файлов с 2 добавлено и 1 удалено
  1. 2 1
      drivers/hid/usbhid/hiddev.c

+ 2 - 1
drivers/hid/usbhid/hiddev.c

@@ -923,10 +923,11 @@ void hiddev_disconnect(struct hid_device *hid)
 	usb_deregister_dev(usbhid->intf, &hiddev_class);
 	usb_deregister_dev(usbhid->intf, &hiddev_class);
 
 
 	if (hiddev->open) {
 	if (hiddev->open) {
+		mutex_unlock(&hiddev->existancelock);
 		usbhid_close(hiddev->hid);
 		usbhid_close(hiddev->hid);
 		wake_up_interruptible(&hiddev->wait);
 		wake_up_interruptible(&hiddev->wait);
 	} else {
 	} else {
+		mutex_unlock(&hiddev->existancelock);
 		kfree(hiddev);
 		kfree(hiddev);
 	}
 	}
-	mutex_unlock(&hiddev->existancelock);
 }
 }