public inbox for u-boot@lists.denx.de
 help / color / mirror / Atom feed
From: Simon Goldschmidt <simon.k.r.goldschmidt@gmail.com>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH 1/2] usb: composite: fix possible alignment issues
Date: Thu, 21 Nov 2019 22:12:41 +0100	[thread overview]
Message-ID: <89b1b3c4-6fe7-7c26-9da1-c968deb5f997@gmail.com> (raw)
In-Reply-To: <f95ee724-e57a-8314-e935-acaacc46f9de@gmx.de>

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@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;
>>
> 

      reply	other threads:[~2019-11-21 21:12 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-11-12 21:26 [U-Boot] [PATCH 1/2] usb: composite: fix possible alignment issues Simon Goldschmidt
2019-11-12 21:26 ` [U-Boot] [PATCH 2/2] usb: dwc2: " Simon Goldschmidt
2019-11-21 19:36 ` [U-Boot] [PATCH 1/2] usb: composite: " Heinrich Schuchardt
2019-11-21 21:12   ` Simon Goldschmidt [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=89b1b3c4-6fe7-7c26-9da1-c968deb5f997@gmail.com \
    --to=simon.k.r.goldschmidt@gmail.com \
    --cc=u-boot@lists.denx.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox