memset(alt->endpoint, 0, len); 
static int usb_parse_interface(struct device *ddev, int cfgno,    struct usb_host_config *config, unsigned char *buffer, int size,    u8 inums[], u8 nalts[]){	unsigned char *buffer0 = buffer;	struct usb_interface_descriptor	*d;	int inum, asnum;	struct usb_interface_cache *intfc;	struct usb_host_interface *alt;	int i, n;	int len, retval;	int num_ep, num_ep_orig;	d = (struct usb_interface_descriptor *) buffer;	buffer += d->bLength;	size -= d->bLength;	if (d->bLength < USB_DT_INTERFACE_SIZE)		goto skip_to_next_interface_descriptor;	/* Which interface entry is this? */	intfc = NULL;	inum = d->bInterfaceNumber;	for (i = 0; i < config->desc.bNumInterfaces; ++i) {		if (inums[i] == inum) {			intfc = config->intf_cache[i];			break;		}	}	if (!intfc || intfc->num_altsetting >= nalts[i])		goto skip_to_next_interface_descriptor;	/* Check for duplicate altsetting entries */	asnum = d->bAlternateSetting;	for ((i = 0, alt = &intfc->altsetting[0]);	      i < intfc->num_altsetting;	     (++i, ++alt)) {		if (alt->desc.bAlternateSetting == asnum) {			dev_warn(ddev, "Duplicate descriptor for config %d "			    "interface %d altsetting %d, skipping\n",			    cfgno, inum, asnum);			goto skip_to_next_interface_descriptor;		}	}	++intfc->num_altsetting;	memcpy(&alt->desc, d, USB_DT_INTERFACE_SIZE);	/* Skip over any Class Specific or Vendor Specific descriptors;	 * find the first endpoint or interface descriptor */	alt->extra = buffer;	i = find_next_descriptor(buffer, size, USB_DT_ENDPOINT,	    USB_DT_INTERFACE, &n);	alt->extralen = i;	if (n > 0)		dev_dbg(ddev, "skipped %d descriptor%s after %s\n",		    n, plural(n), "interface");	buffer += i;	size -= i;	/* Allocate space for the right(?) number of endpoints */	num_ep = num_ep_orig = alt->desc.bNumEndpoints;	alt->desc.bNumEndpoints = 0;		// Use as a counter	if (num_ep > USB_MAXENDPOINTS) {		dev_warn(ddev, "too many endpoints for config %d interface %d "		    "altsetting %d: %d, using maximum allowed: %d\n",		    cfgno, inum, asnum, num_ep, USB_MAXENDPOINTS);		num_ep = USB_MAXENDPOINTS;	}	len = sizeof(struct usb_host_endpoint) * num_ep;	alt->endpoint = kmalloc(len, GFP_KERNEL);	if (!alt->endpoint)		return -ENOMEM;	memset(alt->endpoint, 0, len);	/* Parse all the endpoint descriptors */	n = 0;	while (size > 0) {		if (((struct usb_descriptor_header *) buffer)->bDescriptorType		     == USB_DT_INTERFACE)			break;		retval = usb_parse_endpoint(ddev, cfgno, inum, asnum, alt,		    num_ep, buffer, size);		if (retval < 0)			return retval;		++n;		buffer += retval;		size -= retval;	}	if (n != num_ep_orig)		dev_warn(ddev, "config %d interface %d altsetting %d has %d "		    "endpoint descriptor%s, different from the interface "		    "descriptor's value: %d\n",		    cfgno, inum, asnum, n, plural(n), num_ep_orig);	return buffer - buffer0;skip_to_next_interface_descriptor:	i = find_next_descriptor(buffer, size, USB_DT_INTERFACE,	    USB_DT_INTERFACE, NULL);	return buffer - buffer0 + i;}
10457	/local/tlutelli/issta_data/temp/c/2005_temp/2005/10457/0a1ef3b5a765a6f20e7b8caf295aad3276243966/config.c/buggy/drivers/usb/core/config.c