The length of the configuration descriptor is already used in
usbd_parse_idesc().  The diff below reuses the same pattern to
add the size argument to free(9), ok?

Index: usb_subr.c
===================================================================
RCS file: /cvs/src/sys/dev/usb/usb_subr.c,v
retrieving revision 1.138
diff -u -p -r1.138 usb_subr.c
--- usb_subr.c  19 Jul 2018 12:35:14 -0000      1.138
+++ usb_subr.c  8 Nov 2018 17:31:26 -0000
@@ -647,7 +647,7 @@ usbd_set_config_index(struct usbd_device
                for (ifcidx = 0; ifcidx < nifc; ifcidx++)
                        usbd_free_iface_data(dev, ifcidx);
                free(dev->ifaces, M_USB, 0);
-               free(dev->cdesc, M_USB, 0);
+               free(dev->cdesc, M_USB, UGETW(dev->cdesc->wTotalLength));
                dev->ifaces = NULL;
                dev->cdesc = NULL;
                dev->config = USB_UNCONFIG_NO;
@@ -1407,7 +1407,7 @@ usb_free_device(struct usbd_device *dev)
                free(dev->ifaces, M_USB, 0);
        }
        if (dev->cdesc != NULL)
-               free(dev->cdesc, M_USB, 0);
+               free(dev->cdesc, M_USB, UGETW(dev->cdesc->wTotalLength));
        if (dev->subdevs != NULL)
                free(dev->subdevs, M_USB, 0);
        dev->bus->devices[dev->address] = NULL;
Index: ugen.c
===================================================================
RCS file: /cvs/src/sys/dev/usb/ugen.c,v
retrieving revision 1.98
diff -u -p -r1.98 ugen.c
--- ugen.c      1 May 2018 18:14:46 -0000       1.98
+++ ugen.c      8 Nov 2018 17:00:28 -0000
@@ -1051,12 +1051,12 @@ ugen_do_ioctl(struct ugen_softc *sc, int
                        return (EINVAL);
                idesc = usbd_find_idesc(cdesc, ai->uai_interface_index, 0);
                if (idesc == NULL) {
-                       free(cdesc, M_TEMP, 0);
+                       free(cdesc, M_TEMP, UGETW(cdesc->wTotalLength));
                        return (EINVAL);
                }
                ai->uai_alt_no = usbd_get_no_alts(cdesc,
                    idesc->bInterfaceNumber);
-               free(cdesc, M_TEMP, 0);
+               free(cdesc, M_TEMP, UGETW(cdesc->wTotalLength));
                break;
        case USB_GET_DEVICE_DESC:
                *(usb_device_descriptor_t *)addr =
@@ -1068,7 +1068,7 @@ ugen_do_ioctl(struct ugen_softc *sc, int
                if (cdesc == NULL)
                        return (EINVAL);
                cd->ucd_desc = *cdesc;
-               free(cdesc, M_TEMP, 0);
+               free(cdesc, M_TEMP, UGETW(cdesc->wTotalLength));
                break;
        case USB_GET_INTERFACE_DESC:
                id = (struct usb_interface_desc *)addr;
@@ -1082,11 +1082,11 @@ ugen_do_ioctl(struct ugen_softc *sc, int
                        alt = id->uid_alt_index;
                idesc = usbd_find_idesc(cdesc, id->uid_interface_index, alt);
                if (idesc == NULL) {
-                       free(cdesc, M_TEMP, 0);
+                       free(cdesc, M_TEMP, UGETW(cdesc->wTotalLength));
                        return (EINVAL);
                }
                id->uid_desc = *idesc;
-               free(cdesc, M_TEMP, 0);
+               free(cdesc, M_TEMP, UGETW(cdesc->wTotalLength));
                break;
        case USB_GET_ENDPOINT_DESC:
                ed = (struct usb_endpoint_desc *)addr;
@@ -1101,11 +1101,11 @@ ugen_do_ioctl(struct ugen_softc *sc, int
                edesc = usbd_find_edesc(cdesc, ed->ued_interface_index,
                                        alt, ed->ued_endpoint_index);
                if (edesc == NULL) {
-                       free(cdesc, M_TEMP, 0);
+                       free(cdesc, M_TEMP, UGETW(cdesc->wTotalLength));
                        return (EINVAL);
                }
                ed->ued_desc = *edesc;
-               free(cdesc, M_TEMP, 0);
+               free(cdesc, M_TEMP, UGETW(cdesc->wTotalLength));
                break;
        case USB_GET_FULL_DESC:
        {
@@ -1130,7 +1130,7 @@ ugen_do_ioctl(struct ugen_softc *sc, int
                uio.uio_rw = UIO_READ;
                uio.uio_procp = p;
                error = uiomove((void *)cdesc, len, &uio);
-               free(cdesc, M_TEMP, 0);
+               free(cdesc, M_TEMP, UGETW(cdesc->wTotalLength));
                return (error);
        }
        case USB_DO_REQUEST:
@@ -1196,8 +1196,7 @@ ugen_do_ioctl(struct ugen_softc *sc, int
                        }
                }
        ret:
-               if (ptr)
-                       free(ptr, M_TEMP, len);
+               free(ptr, M_TEMP, len);
                return (error);
        }
        case USB_GET_DEVICEINFO:

Reply via email to