On Tue, 7 Sep 2004, Alan Stern wrote:

> In both places the code needs to do something like this:
> 
>       struct usb_host_config *actconfig = udev->actconfig;
> 
>       if (!actconfig)
>               return 0;
>       len = usb_string(udev, actconfig->desc.field,...
> 
> Otherwise we run the risk that udev->actconfig could change from a 
> non-NULL value to NULL immediately after the test but before the 
> dereference.

Thanks! I fixed both places, so here's the new version.

-- 
Alexander

Homepage: http://www.sensi.org/~ak/

Signed-off-by: Alex Kanavin <[EMAIL PROTECTED]>

diff -uNr linux-2.6.8-1.521/drivers/usb/core/sysfs.c 
linux-2.6.8-1.521-ak/drivers/usb/core/sysfs.c
--- linux-2.6.8-1.521/drivers/usb/core/sysfs.c  2004-09-02 01:20:24.000000000 +0300
+++ linux-2.6.8-1.521-ak/drivers/usb/core/sysfs.c       2004-09-07 23:48:15.000000000 
+0300
@@ -27,11 +27,13 @@
 static ssize_t  show_##field (struct device *dev, char *buf)           \
 {                                                                      \
        struct usb_device *udev;                                        \
+       struct usb_host_config *actconfig;                              \
                                                                        \
        udev = to_usb_device (dev);                                     \
-       if (udev->actconfig)                                            \
+       actconfig = udev->actconfig;                                    \
+       if (actconfig)                                                  \
                return sprintf (buf, format_string,                     \
-                               udev->actconfig->desc.field * multiplier);      \
+                               actconfig->desc.field * multiplier);    \
        else                                                            \
                return 0;                                               \
 }                                                                      \
@@ -44,6 +46,28 @@
 usb_actconfig_attr (bmAttributes, 1, "%2x\n")
 usb_actconfig_attr (bMaxPower, 2, "%3dmA\n")
 
+#define usb_actconfig_str(name, field)                                 \
+static ssize_t  show_##name(struct device *dev, char *buf)             \
+{                                                                      \
+       struct usb_device *udev;                                        \
+       struct usb_host_config *actconfig;                              \
+       int len;                                                        \
+                                                                       \
+       udev = to_usb_device (dev);                                     \
+       actconfig = udev->actconfig;                                    \
+       if (!actconfig)                                                 \
+               return 0;                                               \
+       len = usb_string(udev, actconfig->desc.field, buf, PAGE_SIZE);  \
+       if (len < 0)                                                    \
+               return 0;                                               \
+       buf[len] = '\n';                                                \
+       buf[len+1] = 0;                                                 \
+       return len+1;                                                   \
+}                                                                      \
+static DEVICE_ATTR(name, S_IRUGO, show_##name, NULL);
+
+usb_actconfig_str (configuration, iConfiguration)
+
 /* configuration value is always present, and r/w */
 usb_actconfig_show(bConfigurationValue, 1, "%u\n");
 
@@ -198,6 +222,7 @@
                device_create_file (dev, &dev_attr_product);
        if (udev->descriptor.iSerialNumber)
                device_create_file (dev, &dev_attr_serial);
+       device_create_file (dev, &dev_attr_configuration);
 }
 
 void usb_remove_sysfs_dev_files (struct usb_device *udev)
@@ -212,6 +237,7 @@
                device_remove_file(dev, &dev_attr_product);
        if (udev->descriptor.iSerialNumber)
                device_remove_file(dev, &dev_attr_serial);
+       device_remove_file (dev, &dev_attr_configuration);
 }
 
 /* Interface fields */
@@ -231,7 +257,26 @@
 usb_intf_attr (bInterfaceClass, "%02x\n")
 usb_intf_attr (bInterfaceSubClass, "%02x\n")
 usb_intf_attr (bInterfaceProtocol, "%02x\n")
-usb_intf_attr (iInterface, "%02x\n")
+
+#define usb_intf_str(name, field)                                      \
+static ssize_t  show_##name(struct device *dev, char *buf)             \
+{                                                                      \
+       struct usb_interface *intf;                                     \
+       struct usb_device *udev;                                        \
+       int len;                                                        \
+                                                                       \
+       intf = to_usb_interface (dev);                                  \
+       udev = interface_to_usbdev (intf);                              \
+       len = usb_string(udev, intf->cur_altsetting->desc.field, buf, PAGE_SIZE);\
+       if (len < 0)                                                    \
+               return 0;                                               \
+       buf[len] = '\n';                                                \
+       buf[len+1] = 0;                                                 \
+       return len+1;                                                   \
+}                                                                      \
+static DEVICE_ATTR(name, S_IRUGO, show_##name, NULL);
+
+usb_intf_str (interface, iInterface);
 
 static struct attribute *intf_attrs[] = {
        &dev_attr_bInterfaceNumber.attr,
@@ -240,7 +285,6 @@
        &dev_attr_bInterfaceClass.attr,
        &dev_attr_bInterfaceSubClass.attr,
        &dev_attr_bInterfaceProtocol.attr,
-       &dev_attr_iInterface.attr,
        NULL,
 };
 static struct attribute_group intf_attr_grp = {
@@ -250,9 +294,17 @@
 void usb_create_sysfs_intf_files (struct usb_interface *intf)
 {
        sysfs_create_group(&intf->dev.kobj, &intf_attr_grp);
+
+       if (intf->cur_altsetting->desc.iInterface)
+               device_create_file(&intf->dev, &dev_attr_interface);
+               
 }
 
 void usb_remove_sysfs_intf_files (struct usb_interface *intf)
 {
        sysfs_remove_group(&intf->dev.kobj, &intf_attr_grp);
+
+       if (intf->cur_altsetting->desc.iInterface)
+               device_remove_file(&intf->dev, &dev_attr_interface);
+
 }




-------------------------------------------------------
This SF.Net email is sponsored by BEA Weblogic Workshop
FREE Java Enterprise J2EE developer tools!
Get your free copy of BEA WebLogic Workshop 8.1 today.
http://ads.osdn.com/?ad_id=5047&alloc_id=10808&op=click
_______________________________________________
[EMAIL PROTECTED]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel

Reply via email to