Module Name: src Committed By: riastradh Date: Sun Apr 17 13:15:15 UTC 2022
Modified Files: src/sys/dev/usb: umidi.c Log Message: umidi(4): Restore umidi_cs_descriptor_t type. Had been previously deleted under the misapprehension that usb_descriptor_t is appropriate here, but it's not -- it should not have the bDescriptorSubtype member. To generate a diff of this commit: cvs rdiff -u -r1.86 -r1.87 src/sys/dev/usb/umidi.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/dev/usb/umidi.c diff -u src/sys/dev/usb/umidi.c:1.86 src/sys/dev/usb/umidi.c:1.87 --- src/sys/dev/usb/umidi.c:1.86 Sat Mar 19 20:44:07 2022 +++ src/sys/dev/usb/umidi.c Sun Apr 17 13:15:15 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: umidi.c,v 1.86 2022/03/19 20:44:07 riastradh Exp $ */ +/* $NetBSD: umidi.c,v 1.87 2022/04/17 13:15:15 riastradh Exp $ */ /* * Copyright (c) 2001, 2012, 2014 The NetBSD Foundation, Inc. @@ -32,7 +32,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: umidi.c,v 1.86 2022/03/19 20:44:07 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: umidi.c,v 1.87 2022/04/17 13:15:15 riastradh Exp $"); #ifdef _KERNEL_OPT #include "opt_usb.h" @@ -70,6 +70,13 @@ __KERNEL_RCSID(0, "$NetBSD: umidi.c,v 1. #define UMIDI_EMBEDDED 0x01 #define UMIDI_EXTERNAL 0x02 +/* generic, for iteration */ +typedef struct { + uByte bLength; + uByte bDescriptorType; + uByte bDescriptorSubtype; +} UPACKED umidi_cs_descriptor_t; + typedef struct { uByte bLength; uByte bDescriptorType; @@ -866,6 +873,7 @@ alloc_all_endpoints_yamaha(struct umidi_ char *end; usb_config_descriptor_t *cdesc; usb_descriptor_t *desc; + umidi_cs_descriptor_t *csdesc; usb_interface_descriptor_t *idesc; umidi_cs_interface_descriptor_t *udesc; usb_endpoint_descriptor_t *epd; @@ -902,12 +910,13 @@ alloc_all_endpoints_yamaha(struct umidi_ return USBD_INVAL; /* count jacks */ - if (!(desc->bDescriptorType == UDESC_CS_INTERFACE && - desc->bDescriptorSubtype == UMIDI_MS_HEADER)) + if (desc->bDescriptorType != UDESC_CS_INTERFACE || + desc->bLength < sizeof(*csdesc)) return USBD_INVAL; - if (desc->bLength < sizeof(*udesc)) + csdesc = (umidi_cs_descriptor_t *)desc; + if (csdesc->bDescriptorSubtype != UMIDI_MS_HEADER) return USBD_INVAL; - udesc = TO_CSIFD(desc); + udesc = TO_CSIFD(csdesc); if (UGETW(udesc->wTotalLength) > end - (char *)udesc) return USBD_INVAL; if (UGETW(udesc->wTotalLength) < udesc->bLength) @@ -919,13 +928,15 @@ alloc_all_endpoints_yamaha(struct umidi_ if (desc->bLength < sizeof(*desc) || desc->bLength > end - (char *)desc) break; - if (desc->bDescriptorType == UDESC_CS_INTERFACE && - desc->bLength >= UMIDI_JACK_DESCRIPTOR_SIZE) { - if (desc->bDescriptorSubtype == UMIDI_OUT_JACK) - sc->sc_out_num_jacks++; - else if (desc->bDescriptorSubtype == UMIDI_IN_JACK) - sc->sc_in_num_jacks++; - } + if (desc->bDescriptorType != UDESC_CS_INTERFACE || + desc->bLength < sizeof(*csdesc) || + desc->bLength < UMIDI_JACK_DESCRIPTOR_SIZE) + continue; + csdesc = (umidi_cs_descriptor_t *)desc; + if (csdesc->bDescriptorSubtype == UMIDI_OUT_JACK) + sc->sc_out_num_jacks++; + else if (csdesc->bDescriptorSubtype == UMIDI_IN_JACK) + sc->sc_in_num_jacks++; } /* validate some parameters */