[U-Boot] [PATCH v2 1/2] usb: composite: fix possible alignment issues

Lukasz Majewski lukma at denx.de
Thu Nov 21 22:38:31 UTC 2019


On Thu, 21 Nov 2019 22:15:22 +0100
Simon Goldschmidt <simon.k.r.goldschmidt at gmail.com> 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>
> ---
> 
> Changes in v2:
> - fix compiler warning "dereferencing ‘void *'"
> 
>  drivers/usb/gadget/composite.c | 25 ++++++++++++++++++-------
>  1 file changed, 18 insertions(+), 7 deletions(-)
> 
> diff --git a/drivers/usb/gadget/composite.c
> b/drivers/usb/gadget/composite.c index 618a7d5016..c98a444245 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,21 @@ 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) {
>  	const struct usb_gadget_strings	*s;
>  	u16				language;
> -	__le16				*tmp;
> +	__le16_packed			*tmp;
> +	__le16_packed			*end = (buf + 252);
>  
>  	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 < end; tmp++) {
> +			if (tmp->val == language)
>  				goto repeat;
>  		}
> -		*tmp++ = language;
> +		tmp->val = language;
>  repeat:
>  		sp++;
>  	}
> @@ -705,7 +714,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 +731,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;

Acked-by: Lukasz Majewski <lukma at denx.de>


Best regards,

Lukasz Majewski

--

DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-59 Fax: (+49)-8142-66989-80 Email: lukma at denx.de
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 488 bytes
Desc: OpenPGP digital signature
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20191121/28c4c32c/attachment.sig>


More information about the U-Boot mailing list