Merge branch 'core-objtool-for-linus' of git://git.kernel.org/pub/scm/linux/kernel...
[linux-block.git] / drivers / media / usb / gspca / stv06xx / stv06xx.c
index 79653d4099516f7235b9de87e052a40d906b8526..95673fc0a99c52aa5f64aac6b58c410da72a5a00 100644 (file)
@@ -282,6 +282,9 @@ static int stv06xx_start(struct gspca_dev *gspca_dev)
                return -EIO;
        }
 
+       if (alt->desc.bNumEndpoints < 1)
+               return -ENODEV;
+
        packet_size = le16_to_cpu(alt->endpoint[0].desc.wMaxPacketSize);
        err = stv06xx_write_bridge(sd, STV_ISO_SIZE_L, packet_size);
        if (err < 0)
@@ -306,11 +309,21 @@ out:
 
 static int stv06xx_isoc_init(struct gspca_dev *gspca_dev)
 {
+       struct usb_interface_cache *intfc;
        struct usb_host_interface *alt;
        struct sd *sd = (struct sd *) gspca_dev;
 
+       intfc = gspca_dev->dev->actconfig->intf_cache[0];
+
+       if (intfc->num_altsetting < 2)
+               return -ENODEV;
+
+       alt = &intfc->altsetting[1];
+
+       if (alt->desc.bNumEndpoints < 1)
+               return -ENODEV;
+
        /* Start isoc bandwidth "negotiation" at max isoc bandwidth */
-       alt = &gspca_dev->dev->actconfig->intf_cache[0]->altsetting[1];
        alt->endpoint[0].desc.wMaxPacketSize =
                cpu_to_le16(sd->sensor->max_packet_size[gspca_dev->curr_mode]);
 
@@ -323,6 +336,10 @@ static int stv06xx_isoc_nego(struct gspca_dev *gspca_dev)
        struct usb_host_interface *alt;
        struct sd *sd = (struct sd *) gspca_dev;
 
+       /*
+        * Existence of altsetting and endpoint was verified in
+        * stv06xx_isoc_init()
+        */
        alt = &gspca_dev->dev->actconfig->intf_cache[0]->altsetting[1];
        packet_size = le16_to_cpu(alt->endpoint[0].desc.wMaxPacketSize);
        min_packet_size = sd->sensor->min_packet_size[gspca_dev->curr_mode];