]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
uapi: cdc.h: cleanly provide for more interfaces and countries
authorOliver Neukum <oneukum@suse.com>
Tue, 11 Nov 2025 13:46:10 +0000 (14:46 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 21 Nov 2025 14:12:12 +0000 (15:12 +0100)
The spec requires at least one interface respectively country.
It allows multiple ones. This needs to be clearly said in the UAPI.
This is subject to sanity checking in cdc_parse_cdc_header(), thus
we can trust the length.

Signed-off-by: Oliver Neukum <oneukum@suse.com>
Link: https://patch.msgid.link/20251111134641.4118827-1-oneukum@suse.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/class/cdc-acm.c
include/uapi/linux/usb/cdc.h

index 73f9476774ae6ad4113cf70a5956c7860492fc20..54be4aa1dcb2af6d5271ec8473903ed828cadfed 100644 (file)
@@ -1475,7 +1475,7 @@ made_compressed_probe:
                if (!acm->country_codes)
                        goto skip_countries;
                acm->country_code_size = cfd->bLength - 4;
-               memcpy(acm->country_codes, (u8 *)&cfd->wCountyCode0,
+               memcpy(acm->country_codes, cfd->wCountryCodes,
                                                        cfd->bLength - 4);
                acm->country_rel_date = cfd->iCountryCodeRelDate;
 
index 1924cf665448d09f9083350eff9f2959902b9887..7bd5d12d8b26c994a01ef4bac1fb9ccc121e1204 100644 (file)
@@ -104,8 +104,10 @@ struct usb_cdc_union_desc {
        __u8    bDescriptorSubType;
 
        __u8    bMasterInterface0;
-       __u8    bSlaveInterface0;
-       /* ... and there could be other slave interfaces */
+       union {
+               __u8    bSlaveInterface0;
+               __DECLARE_FLEX_ARRAY(__u8, bSlaveInterfaces);
+       };
 } __attribute__ ((packed));
 
 /* "Country Selection Functional Descriptor" from CDC spec 5.2.3.9 */
@@ -115,8 +117,10 @@ struct usb_cdc_country_functional_desc {
        __u8    bDescriptorSubType;
 
        __u8    iCountryCodeRelDate;
-       __le16  wCountyCode0;
-       /* ... and there can be a lot of country codes */
+       union {
+               __le16  wCountryCode0;
+               __DECLARE_FLEX_ARRAY(__le16, wCountryCodes);
+       };
 } __attribute__ ((packed));
 
 /* "Network Channel Terminal Functional Descriptor" from CDC spec 5.2.3.11 */