Patch "USB: Proper handling of Race Condition when two USB class drivers try to call init_usb_class simultaneously" has been added to the 4.10-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
USB: Proper handling of Race Condition when two USB class drivers try to call init_usb_class simultaneously
to the 4.10-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
usb-proper-handling-of-race-condition-when-two-usb-class-drivers-try-to-call-init_usb_class-simultaneously.patch
and it can be found in the queue-4.10 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
2f86a96be0ccb1302b7eee7855dbee5ce4dc5dfbMon Sep 17 00:00:00 2001
From: Ajay Kaher <[email protected]>
Date: Tue, 28 Mar 2017 08:09:32 -0400
Subject: USB: Proper handling of Race Condition when two USB class drivers try to call init_usb_class simultaneously
From: Ajay Kaher <[email protected]>
commit 2f86a96be0ccb1302b7eee7855dbee5ce4dc5dfb upstream.
There is race condition when two USB class drivers try to call init_usb_class at the same time and leads to crash. code path: probe->usb_register_dev->init_usb_class
To solve this, mutex locking has been added in init_usb_class() and destroy_usb_class().
As pointed by Alan, removed "if (usb_class)" test from destroy_usb_class() because usb_class can never be NULL there.
--- drivers/usb/core/file.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-)
drivers/usb/core/file.c +7 -2
@@ -29,6 +29,7 @@#define MAX_USB_MINORS 256static const struct file_operations *usb_minors[MAX_USB_MINORS ];static DECLARE_RWSEM (minor_rwsem); +static DEFINE_MUTEX (init_usb_class_mutex);static int usb_open (struct inode *inode,struct file *file) {
@@ -111,8 +112,9 @@ static void release_usb_class(struct krestatic void destroy_usb_class (void ) { -if (usb_class) -kref_put (&usb_class->kref, release_usb_class); +mutex_lock (&init_usb_class_mutex); +kref_put (&usb_class->kref, release_usb_class); +mutex_unlock (&init_usb_class_mutex); }int usb_major_init (void )
@@ -173,7 +175,10 @@ int usb_register_dev(struct usb_interfacif (intf->minor >=0 )return -EADDRINUSE ; +mutex_lock (&init_usb_class_mutex); retval =init_usb_class (); +mutex_unlock (&init_usb_class_mutex); +if (retval)return retval;
Patches currently in stable-queue which might be from [email protected] are
queue-4.10/usb-proper-handling-of-race-condition-when-two-usb-class-drivers-try-to-call-init_usb_class-simultaneously.patch