[U-Boot] [PATCH 1/2] usb: composite: fix possible alignment issues
Simon Goldschmidt
simon.k.r.goldschmidt at gmail.com
Thu Nov 21 21:12:41 UTC 2019
Am 21.11.2019 um 20:36 schrieb Heinrich Schuchardt:
> On 11/12/19 10:26 PM, Simon Goldschmidt wrote:
>> Since upgrading to gcc9, warnings are issued:
>> "taking address of packed member of ‘...’ may result in an unaligned
>> pointer value"
>>
>> Fix this by converting two functions to use unaligned access since packed
>> structures may be on an unaligned address, depending on USB hardware.
>>
>> Signed-off-by: Simon Goldschmidt <simon.k.r.goldschmidt at gmail.com>
>> ---
>>
>> drivers/usb/gadget/composite.c | 24 +++++++++++++++++-------
>> 1 file changed, 17 insertions(+), 7 deletions(-)
>>
>> diff --git a/drivers/usb/gadget/composite.c b/drivers/usb/gadget/composite.c
>> index 618a7d5016..cfc9512caa 100644
>> --- a/drivers/usb/gadget/composite.c
>> +++ b/drivers/usb/gadget/composite.c
>> @@ -12,8 +12,16 @@
>>
>> #define USB_BUFSIZ 4096
>>
>> +/* Helper type for accessing packed u16 pointers */
>> +typedef struct { __le16 val; } __packed __le16_packed;
>> +
>> static struct usb_composite_driver *composite;
>>
>> +static inline void le16_add_cpu_packed(__le16_packed *var, u16 val)
>> +{
>> + var->val = cpu_to_le16(le16_to_cpu(var->val) + val);
>> +}
>> +
>> /**
>> * usb_add_function() - add a function to a configuration
>> * @config: the configuration
>> @@ -480,20 +488,20 @@ done:
>> * the host side.
>> */
>>
>> -static void collect_langs(struct usb_gadget_strings **sp, __le16 *buf)
>> +static void collect_langs(struct usb_gadget_strings **sp, void *buf)
>
> With this patch and GCC 9.2.1 I get:
>
> In file included from drivers/usb/gadget/g_dnl.c:24:
> drivers/usb/gadget/composite.c: In function ‘collect_langs’:
> drivers/usb/gadget/composite.c:500:41: error: dereferencing ‘void *’
> pointer [-Werror]
> 500 | for (tmp = buf; tmp->val && tmp < &buf[126]; tmp++) {
> | ^
> drivers/usb/gadget/composite.c:500:35: error: comparison of distinct
> pointer types lacks a cast [-Werror]
> 500 | for (tmp = buf; tmp->val && tmp < &buf[126]; tmp++) {
>
> void does not have defined size and so cannot be subscripted.
Right, thanks for testing. I hate it that we don't have -Werror enabled,
as this just slipped through with all the output on the screen.
I'll send v2 fixing that.
Regards,
Simon
>
> Best regards
>
> Heinrich
>
>> {
>> const struct usb_gadget_strings *s;
>> u16 language;
>> - __le16 *tmp;
>> + __le16_packed *tmp;
>>
>> while (*sp) {
>> s = *sp;
>> language = cpu_to_le16(s->language);
>> - for (tmp = buf; *tmp && tmp < &buf[126]; tmp++) {
>> - if (*tmp == language)
>> + for (tmp = buf; tmp->val && tmp < &buf[126]; tmp++) {
>> + if (tmp->val == language)
>> goto repeat;
>> }
>> - *tmp++ = language;
>> + tmp->val = language;
>> repeat:
>> sp++;
>> }
>> @@ -705,7 +713,8 @@ static int bos_desc(struct usb_composite_dev *cdev)
>> */
>> usb_ext = cdev->req->buf + le16_to_cpu(bos->wTotalLength);
>> bos->bNumDeviceCaps++;
>> - le16_add_cpu(&bos->wTotalLength, USB_DT_USB_EXT_CAP_SIZE);
>> + le16_add_cpu_packed((__le16_packed *)&bos->wTotalLength,
>> + USB_DT_USB_EXT_CAP_SIZE);
>> usb_ext->bLength = USB_DT_USB_EXT_CAP_SIZE;
>> usb_ext->bDescriptorType = USB_DT_DEVICE_CAPABILITY;
>> usb_ext->bDevCapabilityType = USB_CAP_TYPE_EXT;
>> @@ -721,7 +730,8 @@ static int bos_desc(struct usb_composite_dev *cdev)
>>
>> ss_cap = cdev->req->buf + le16_to_cpu(bos->wTotalLength);
>> bos->bNumDeviceCaps++;
>> - le16_add_cpu(&bos->wTotalLength, USB_DT_USB_SS_CAP_SIZE);
>> + le16_add_cpu_packed((__le16_packed *)&bos->wTotalLength,
>> + USB_DT_USB_SS_CAP_SIZE);
>> ss_cap->bLength = USB_DT_USB_SS_CAP_SIZE;
>> ss_cap->bDescriptorType = USB_DT_DEVICE_CAPABILITY;
>> ss_cap->bDevCapabilityType = USB_SS_CAP_TYPE;
>>
>
More information about the U-Boot
mailing list