--- local_tree.orig/drivers/usb/core/devio.c 2004-07-25 14:40:17.687826010 +0200 +++ local_tree/drivers/usb/core/devio.c 2004-07-25 14:50:11.447716542 +0200 @@ -708,21 +708,27 @@ static int proc_getdriver(struct dev_state *ps, void __user *arg) { struct usbdevfs_getdriver gd; + struct usb_device *dev = ps->dev; struct usb_interface *intf; - int ret; + int ret = 0; if (copy_from_user(&gd, arg, sizeof(gd))) return -EFAULT; + down(&dev->serialize); + if (!connected(dev)) { + up(&dev->serialize); + return -ENODEV; + } down_read(&usb_bus_type.subsys.rwsem); - intf = usb_ifnum_to_if(ps->dev, gd.interface); + intf = usb_ifnum_to_if(dev, gd.interface); if (!intf || !intf->dev.driver) ret = -ENODATA; - else { - strncpy(gd.driver, intf->dev.driver->name, - sizeof(gd.driver)); - ret = (copy_to_user(arg, &gd, sizeof(gd)) ? -EFAULT : 0); - } + else + strncpy(gd.driver, intf->dev.driver->name, sizeof(gd.driver)); up_read(&usb_bus_type.subsys.rwsem); + up(&dev->serialize); + if (!ret) + ret = (copy_to_user(arg, &gd, sizeof(gd)) ? -EFAULT : 0); return ret; } @@ -1251,14 +1257,8 @@ break; case USBDEVFS_GETDRIVER: - down(&dev->serialize); - if (!connected(dev)) { - up(&dev->serialize); - return -ENODEV; - } snoop(&dev->dev, "%s: GETDRIVER\n", __FUNCTION__); ret = proc_getdriver(ps, p); - up(&dev->serialize); break; case USBDEVFS_CONNECTINFO:
------------------------------------------------------- This SF.Net email is sponsored by OSTG. Have you noticed the changes on Linux.com, ITManagersJournal and NewsForge in the past few weeks? Now, one more big change to announce. We are now OSTG- Open Source Technology Group. Come see the changes on the new OSTG site. www.ostg.com _______________________________________________ [EMAIL PROTECTED] To unsubscribe, use the last form field at: https://lists.sourceforge.net/lists/listinfo/linux-usb-devel