diff --git a/sys/dev/usb/uvideo.c b/sys/dev/usb/uvideo.c index 692bf03b36a0..7386ae3e9d4f 100644 --- a/sys/dev/usb/uvideo.c +++ b/sys/dev/usb/uvideo.c @@ -787,7 +787,7 @@ uvideo_stream_alloc(void) } -static usbd_status +static usbd_status __noinline uvideo_init_control(struct uvideo_softc *sc, const usb_interface_descriptor_t *ifdesc, usbd_desc_iter_t *iter) @@ -811,6 +811,7 @@ uvideo_init_control(struct uvideo_softc *sc, if (uvdesc->bDescriptorSubtype < UDESC_INPUT_TERMINAL || uvdesc->bDescriptorSubtype > UDESC_EXTENSION_UNIT) continue; + KASSERT(nunits < 255); ++nunits; } @@ -843,6 +844,7 @@ uvideo_init_control(struct uvideo_softc *sc, /* TODO: free other units before returning? */ if (sc->sc_unit[i] == NULL) goto enomem; + KASSERT(i < 255); ++i; } @@ -875,7 +877,7 @@ uvideo_init_collection(struct uvideo_softc *sc, * Allocates space for and initializes a uvideo unit based on the * given descriptor. Returns NULL with bad descriptor or ENOMEM. */ -static struct uvideo_unit * +static struct uvideo_unit * __noinline uvideo_unit_alloc(const uvideo_descriptor_t *desc) { struct uvideo_unit *vu; @@ -895,7 +897,7 @@ uvideo_unit_alloc(const uvideo_descriptor_t *desc) return vu; } -static usbd_status +static usbd_status __noinline uvideo_unit_init(struct uvideo_unit *vu, const uvideo_descriptor_t *desc) { struct uvideo_camera_terminal *ct; @@ -981,7 +983,7 @@ uvideo_unit_init(struct uvideo_unit *vu, const uvideo_descriptor_t *desc) return USBD_NORMAL_COMPLETION; } -static void +static void __noinline uvideo_unit_free(struct uvideo_unit *vu) { uvideo_unit_free_sources(vu); @@ -989,7 +991,7 @@ uvideo_unit_free(struct uvideo_unit *vu) kmem_free(vu, sizeof(*vu)); } -static usbd_status +static usbd_status __noinline uvideo_unit_alloc_sources(struct uvideo_unit *vu, uint8_t nsrcs, const uint8_t *src_ids) { @@ -1008,10 +1010,10 @@ uvideo_unit_alloc_sources(struct uvideo_unit *vu, return USBD_NORMAL_COMPLETION; } -static void +static void __noinline uvideo_unit_free_sources(struct uvideo_unit *vu) { - if (vu->vu_nsrcs == 1) + if (vu->vu_nsrcs <= 1) return; kmem_free(vu->s.vu_src_id_ary, @@ -1020,7 +1022,7 @@ uvideo_unit_free_sources(struct uvideo_unit *vu) vu->s.vu_src_id_ary = NULL; } -static usbd_status +static usbd_status __noinline uvideo_unit_alloc_controls(struct uvideo_unit *vu, uint8_t size, const uint8_t *controls) { @@ -1034,7 +1036,7 @@ uvideo_unit_alloc_controls(struct uvideo_unit *vu, uint8_t size, return USBD_NORMAL_COMPLETION; } -static void +static void __noinline uvideo_unit_free_controls(struct uvideo_unit *vu) { kmem_free(vu->vu_controls,