summaryrefslogtreecommitdiff
path: root/libgphoto2_port/usb
diff options
context:
space:
mode:
authorJohannes Erdfelt <johannes@erdfelt.com>2002-01-06 17:51:19 +0000
committerJohannes Erdfelt <johannes@erdfelt.com>2002-01-06 17:51:19 +0000
commit6e2a7c7417982fd118cde420f4d472990890f83f (patch)
tree63dbe0e8a8089bbbd0b08784f6666f6660b6fc7a /libgphoto2_port/usb
parentd21418310e5426f2f8211995ccf2a330eb90f206 (diff)
downloadlibgphoto2-6e2a7c7417982fd118cde420f4d472990890f83f.tar.gz
Make sure dev->config is not NULL before walking the descriptors
Search for the first config/interface/altsetting which actually has endpoints Specify the endpoints in stv0680 git-svn-id: https://svn.code.sf.net/p/gphoto/code/trunk/libgphoto2@3738 67ed7778-7388-44ab-90cf-0a291f65f57c
Diffstat (limited to 'libgphoto2_port/usb')
-rw-r--r--libgphoto2_port/usb/libusb.c61
1 files changed, 50 insertions, 11 deletions
diff --git a/libgphoto2_port/usb/libusb.c b/libgphoto2_port/usb/libusb.c
index 4aee48223..c157b135c 100644
--- a/libgphoto2_port/usb/libusb.c
+++ b/libgphoto2_port/usb/libusb.c
@@ -316,9 +316,14 @@ gp_port_usb_update (GPPort *port)
static int
gp_port_usb_find_bulk(struct usb_device *dev, int config, int interface, int altsetting, int direction)
{
- struct usb_interface_descriptor *intf = &dev->config[config].interface[interface].altsetting[altsetting];
+ struct usb_interface_descriptor *intf;
int i;
+ if (!dev->config)
+ return -1;
+
+ intf = &dev->config[config].interface[interface].altsetting[altsetting];
+
for (i = 0; i < intf->bNumEndpoints; i++) {
if ((intf->endpoint[i].bEndpointAddress & USB_ENDPOINT_DIR_MASK) == direction &&
(intf->endpoint[i].bmAttributes & USB_ENDPOINT_TYPE_MASK) == USB_ENDPOINT_TYPE_BULK)
@@ -329,6 +334,28 @@ gp_port_usb_find_bulk(struct usb_device *dev, int config, int interface, int alt
}
static int
+gp_port_usb_find_first_altsetting(struct usb_device *dev, int *config, int *interface, int *altsetting)
+{
+ int i, i1, i2;
+
+ if (!dev->config)
+ return -1;
+
+ for (i = 0; i < dev->descriptor.bNumConfigurations; i++)
+ for (i1 = 0; i1 < dev->config[i].bNumInterfaces; i1++)
+ for (i2 = 0; i2 < dev->config[i].interface[i1].num_altsetting; i2++)
+ if (dev->config[i].interface[i1].altsetting[i2].bNumEndpoints) {
+ *config = i;
+ *interface = i1;
+ *altsetting = i2;
+
+ return 0;
+ }
+
+ return -1;
+}
+
+static int
gp_port_usb_find_device_lib(GPPort *port, int idvendor, int idproduct)
{
struct usb_bus *bus;
@@ -353,16 +380,23 @@ gp_port_usb_find_device_lib(GPPort *port, int idvendor, int idproduct)
for (dev = bus->devices; dev; dev = dev->next) {
if ((dev->descriptor.idVendor == idvendor) &&
(dev->descriptor.idProduct == idproduct)) {
+ int config, interface, altsetting;
+
port->pl->d = dev;
/* Use the first config, interface and altsetting we find */
+ gp_port_usb_find_first_altsetting(dev, &config, &interface, &altsetting);
+
/* Set the defaults */
- port->settings.usb.config = dev->config[0].bConfigurationValue;
- port->settings.usb.interface = dev->config[0].interface[0].altsetting[0].bInterfaceNumber;
- port->settings.usb.altsetting = dev->config[0].interface[0].altsetting[0].bAlternateSetting;
+ if (dev->config) {
- port->settings.usb.inep = gp_port_usb_find_bulk(dev, 0, 0, 0, USB_ENDPOINT_IN);
- port->settings.usb.outep = gp_port_usb_find_bulk(dev, 0, 0, 0, USB_ENDPOINT_OUT);
+ port->settings.usb.config = dev->config[config].bConfigurationValue;
+ port->settings.usb.interface = dev->config[config].interface[interface].altsetting[altsetting].bInterfaceNumber;
+ port->settings.usb.altsetting = dev->config[config].interface[interface].altsetting[altsetting].bAlternateSetting;
+
+ port->settings.usb.inep = gp_port_usb_find_bulk(dev, config, interface, altsetting, USB_ENDPOINT_IN);
+ port->settings.usb.outep = gp_port_usb_find_bulk(dev, config, interface, altsetting, USB_ENDPOINT_OUT);
+ }
port->pl->d = dev;
@@ -393,6 +427,9 @@ gp_port_usb_match_device_by_class(struct usb_device *dev, int class, int subclas
dev->descriptor.bDeviceProtocol == protocol))
return 1;
+ if (!dev->config)
+ return 0;
+
for (i = 0; i < dev->descriptor.bNumConfigurations; i++) {
struct usb_config_descriptor *config =
&dev->config[i];
@@ -450,12 +487,14 @@ gp_port_usb_find_device_by_class_lib(GPPort *port, int class, int subclass, int
continue;
/* Set the defaults */
- port->settings.usb.config = dev->config[config].bConfigurationValue;
- port->settings.usb.interface = dev->config[config].interface[interface].altsetting[altsetting].bInterfaceNumber;
- port->settings.usb.altsetting = dev->config[config].interface[interface].altsetting[altsetting].bAlternateSetting;
+ if (dev->config) {
+ port->settings.usb.config = dev->config[config].bConfigurationValue;
+ port->settings.usb.interface = dev->config[config].interface[interface].altsetting[altsetting].bInterfaceNumber;
+ port->settings.usb.altsetting = dev->config[config].interface[interface].altsetting[altsetting].bAlternateSetting;
- port->settings.usb.inep = gp_port_usb_find_bulk(dev, config, interface, altsetting, USB_ENDPOINT_IN);
- port->settings.usb.outep = gp_port_usb_find_bulk(dev, config, interface, altsetting, USB_ENDPOINT_OUT);
+ port->settings.usb.inep = gp_port_usb_find_bulk(dev, config, interface, altsetting, USB_ENDPOINT_IN);
+ port->settings.usb.outep = gp_port_usb_find_bulk(dev, config, interface, altsetting, USB_ENDPOINT_OUT);
+ }
port->pl->d = dev;
gp_log (GP_LOG_VERBOSE, "gphoto2-port-usb",