diff mbox series

[RESEND] usbtty: fix possible alignment issues

Message ID 20200107052502.803-1-sw0312.kim@samsung.com
State New
Headers show
Series [RESEND] usbtty: fix possible alignment issues | expand

Commit Message

Seung-Woo Kim Jan. 7, 2020, 5:25 a.m. UTC
With gcc9, below warnings are shown:
  drivers/serial/usbtty.c: In function 'usbtty_init_strings':
  drivers/serial/usbtty.c:590:44: warning: taking address of packed member of 'struct usb_string_descriptor' may result in an unaligned pointer value [-Waddress-of-packed-member]
    590 |  str2wide (CONFIG_USBD_MANUFACTURER, string->wData);
        |                                      ~~~~~~^~~~~~~
  drivers/serial/usbtty.c:596:44: warning: taking address of packed member of 'struct usb_string_descriptor' may result in an unaligned pointer value [-Waddress-of-packed-member]
    597 |  str2wide (CONFIG_USBD_PRODUCT_NAME, string->wData);
        |                                      ~~~~~~^~~~~~~
  drivers/serial/usbtty.c:603:33: warning: taking address of packed member of 'struct usb_string_descriptor' may result in an unaligned pointer value [-Waddress-of-packed-member]
    604 |  str2wide (serial_number, string->wData);
        |                           ~~~~~~^~~~~~~
  drivers/serial/usbtty.c:610:49: warning: taking address of packed member of 'struct usb_string_descriptor' may result in an unaligned pointer value [-Waddress-of-packed-member]
    611 |  str2wide (CONFIG_USBD_CONFIGURATION_STR, string->wData);
        |                                           ~~~~~~^~~~~~~
  drivers/serial/usbtty.c:617:50: warning: taking address of packed member of 'struct usb_string_descriptor' may result in an unaligned pointer value [-Waddress-of-packed-member]
    618 |  str2wide (CONFIG_USBD_DATA_INTERFACE_STR, string->wData);
        |                                            ~~~~~~^~~~~~~
  drivers/serial/usbtty.c:623:50: warning: taking address of packed member of 'struct usb_string_descriptor' may result in an unaligned pointer value [-Waddress-of-packed-member]
    624 |  str2wide (CONFIG_USBD_CTRL_INTERFACE_STR, string->wData);
        |                                            ~~~~~~^~~~~~~

Fix the issues by using packed structure.

Ref: commit 616ebd8b9cb4 ("usb: composite: fix possible alignment issues")
Signed-off-by: Seung-Woo Kim <sw0312.kim at samsung.com>
---
resend with proper e-mail address
---
 drivers/serial/usbtty.c | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

Comments

Tom Rini Jan. 7, 2020, 1:22 p.m. UTC | #1
On Tue, Jan 07, 2020 at 02:25:02PM +0900, Seung-Woo Kim wrote:

> With gcc9, below warnings are shown:
>   drivers/serial/usbtty.c: In function 'usbtty_init_strings':
>   drivers/serial/usbtty.c:590:44: warning: taking address of packed member of 'struct usb_string_descriptor' may result in an unaligned pointer value [-Waddress-of-packed-member]
>     590 |  str2wide (CONFIG_USBD_MANUFACTURER, string->wData);
>         |                                      ~~~~~~^~~~~~~
>   drivers/serial/usbtty.c:596:44: warning: taking address of packed member of 'struct usb_string_descriptor' may result in an unaligned pointer value [-Waddress-of-packed-member]
>     597 |  str2wide (CONFIG_USBD_PRODUCT_NAME, string->wData);
>         |                                      ~~~~~~^~~~~~~
>   drivers/serial/usbtty.c:603:33: warning: taking address of packed member of 'struct usb_string_descriptor' may result in an unaligned pointer value [-Waddress-of-packed-member]
>     604 |  str2wide (serial_number, string->wData);
>         |                           ~~~~~~^~~~~~~
>   drivers/serial/usbtty.c:610:49: warning: taking address of packed member of 'struct usb_string_descriptor' may result in an unaligned pointer value [-Waddress-of-packed-member]
>     611 |  str2wide (CONFIG_USBD_CONFIGURATION_STR, string->wData);
>         |                                           ~~~~~~^~~~~~~
>   drivers/serial/usbtty.c:617:50: warning: taking address of packed member of 'struct usb_string_descriptor' may result in an unaligned pointer value [-Waddress-of-packed-member]
>     618 |  str2wide (CONFIG_USBD_DATA_INTERFACE_STR, string->wData);
>         |                                            ~~~~~~^~~~~~~
>   drivers/serial/usbtty.c:623:50: warning: taking address of packed member of 'struct usb_string_descriptor' may result in an unaligned pointer value [-Waddress-of-packed-member]
>     624 |  str2wide (CONFIG_USBD_CTRL_INTERFACE_STR, string->wData);
>         |                                            ~~~~~~^~~~~~~
> 
> Fix the issues by using packed structure.
> 
> Ref: commit 616ebd8b9cb4 ("usb: composite: fix possible alignment issues")
> Signed-off-by: Seung-Woo Kim <sw0312.kim at samsung.com>
> ---
> resend with proper e-mail address
> ---
>  drivers/serial/usbtty.c | 9 ++++++---
>  1 file changed, 6 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/serial/usbtty.c b/drivers/serial/usbtty.c
> index f1c1a260da..54e67dd0d1 100644
> --- a/drivers/serial/usbtty.c
> +++ b/drivers/serial/usbtty.c
> @@ -48,6 +48,8 @@
>  #define CONFIG_USBD_DATA_INTERFACE_STR "Bulk Data Interface"
>  #define CONFIG_USBD_CTRL_INTERFACE_STR "Control Interface"
>  
> +typedef struct { __le16 val; } __attribute__((aligned(16))) __le16_packed;
> +
>  /*
>   * Buffers to hold input and output data
>   */
> @@ -372,14 +374,15 @@ static int fill_buffer (circbuf_t * buf);
>  void usbtty_poll (void);
>  
>  /* utility function for converting char* to wide string used by USB */
> -static void str2wide (char *str, u16 * wide)
> +static void str2wide (char *str, void *wide)
>  {
>  	int i;
> +	__le16_packed	*tmp = wide;
>  	for (i = 0; i < strlen (str) && str[i]; i++){
>  		#if defined(__LITTLE_ENDIAN)
> -			wide[i] = (u16) str[i];
> +			tmp[i].val = (u16) str[i];
>  		#elif defined(__BIG_ENDIAN)
> -			wide[i] = ((u16)(str[i])<<8);
> +			tmp[i].val = ((u16)(str[i])<<8);
>  		#else
>  			#error "__LITTLE_ENDIAN or __BIG_ENDIAN undefined"
>  		#endif

We generally don't want packed structs and do need to disable this
warning in general.  Is this _really_ a problem, or are we just
silencing the compiler here?  Thanks!
Seung-Woo Kim Jan. 8, 2020, 12:32 a.m. UTC | #2
Hi,

On 2020년 01월 07일 22:22, Tom Rini wrote:
> On Tue, Jan 07, 2020 at 02:25:02PM +0900, Seung-Woo Kim wrote:
> 
...
>> ---
>>  drivers/serial/usbtty.c | 9 ++++++---
>>  1 file changed, 6 insertions(+), 3 deletions(-)
>>
>> diff --git a/drivers/serial/usbtty.c b/drivers/serial/usbtty.c
>> index f1c1a260da..54e67dd0d1 100644
>> --- a/drivers/serial/usbtty.c
>> +++ b/drivers/serial/usbtty.c
>> @@ -48,6 +48,8 @@
>>  #define CONFIG_USBD_DATA_INTERFACE_STR "Bulk Data Interface"
>>  #define CONFIG_USBD_CTRL_INTERFACE_STR "Control Interface"
>>  
>> +typedef struct { __le16 val; } __attribute__((aligned(16))) __le16_packed;
>> +
>>  /*
>>   * Buffers to hold input and output data
>>   */
>> @@ -372,14 +374,15 @@ static int fill_buffer (circbuf_t * buf);
>>  void usbtty_poll (void);
>>  
>>  /* utility function for converting char* to wide string used by USB */
>> -static void str2wide (char *str, u16 * wide)
>> +static void str2wide (char *str, void *wide)
>>  {
>>  	int i;
>> +	__le16_packed	*tmp = wide;
>>  	for (i = 0; i < strlen (str) && str[i]; i++){
>>  		#if defined(__LITTLE_ENDIAN)
>> -			wide[i] = (u16) str[i];
>> +			tmp[i].val = (u16) str[i];
>>  		#elif defined(__BIG_ENDIAN)
>> -			wide[i] = ((u16)(str[i])<<8);
>> +			tmp[i].val = ((u16)(str[i])<<8);
>>  		#else
>>  			#error "__LITTLE_ENDIAN or __BIG_ENDIAN undefined"
>>  		#endif
> 
> We generally don't want packed structs and do need to disable this
> warning in general.  Is this _really_ a problem, or are we just
> silencing the compiler here?  Thanks!

The change makes just silence for the warnings as like composite.c in
usb gadget.

Regards,
- Seung-Woo Kim
Tom Rini Jan. 8, 2020, 12:46 a.m. UTC | #3
On Wed, Jan 08, 2020 at 09:32:03AM +0900, Seung-Woo Kim wrote:
> Hi,
> 
> On 2020년 01월 07일 22:22, Tom Rini wrote:
> > On Tue, Jan 07, 2020 at 02:25:02PM +0900, Seung-Woo Kim wrote:
> > 
> ...
> >> ---
> >>  drivers/serial/usbtty.c | 9 ++++++---
> >>  1 file changed, 6 insertions(+), 3 deletions(-)
> >>
> >> diff --git a/drivers/serial/usbtty.c b/drivers/serial/usbtty.c
> >> index f1c1a260da..54e67dd0d1 100644
> >> --- a/drivers/serial/usbtty.c
> >> +++ b/drivers/serial/usbtty.c
> >> @@ -48,6 +48,8 @@
> >>  #define CONFIG_USBD_DATA_INTERFACE_STR "Bulk Data Interface"
> >>  #define CONFIG_USBD_CTRL_INTERFACE_STR "Control Interface"
> >>  
> >> +typedef struct { __le16 val; } __attribute__((aligned(16))) __le16_packed;
> >> +
> >>  /*
> >>   * Buffers to hold input and output data
> >>   */
> >> @@ -372,14 +374,15 @@ static int fill_buffer (circbuf_t * buf);
> >>  void usbtty_poll (void);
> >>  
> >>  /* utility function for converting char* to wide string used by USB */
> >> -static void str2wide (char *str, u16 * wide)
> >> +static void str2wide (char *str, void *wide)
> >>  {
> >>  	int i;
> >> +	__le16_packed	*tmp = wide;
> >>  	for (i = 0; i < strlen (str) && str[i]; i++){
> >>  		#if defined(__LITTLE_ENDIAN)
> >> -			wide[i] = (u16) str[i];
> >> +			tmp[i].val = (u16) str[i];
> >>  		#elif defined(__BIG_ENDIAN)
> >> -			wide[i] = ((u16)(str[i])<<8);
> >> +			tmp[i].val = ((u16)(str[i])<<8);
> >>  		#else
> >>  			#error "__LITTLE_ENDIAN or __BIG_ENDIAN undefined"
> >>  		#endif
> > 
> > We generally don't want packed structs and do need to disable this
> > warning in general.  Is this _really_ a problem, or are we just
> > silencing the compiler here?  Thanks!
> 
> The change makes just silence for the warnings as like composite.c in
> usb gadget.

OK, thanks.  NAK on this and I will pick up the general change to
disable this warning soon.
diff mbox series

Patch

diff --git a/drivers/serial/usbtty.c b/drivers/serial/usbtty.c
index f1c1a260da..54e67dd0d1 100644
--- a/drivers/serial/usbtty.c
+++ b/drivers/serial/usbtty.c
@@ -48,6 +48,8 @@ 
 #define CONFIG_USBD_DATA_INTERFACE_STR "Bulk Data Interface"
 #define CONFIG_USBD_CTRL_INTERFACE_STR "Control Interface"
 
+typedef struct { __le16 val; } __attribute__((aligned(16))) __le16_packed;
+
 /*
  * Buffers to hold input and output data
  */
@@ -372,14 +374,15 @@  static int fill_buffer (circbuf_t * buf);
 void usbtty_poll (void);
 
 /* utility function for converting char* to wide string used by USB */
-static void str2wide (char *str, u16 * wide)
+static void str2wide (char *str, void *wide)
 {
 	int i;
+	__le16_packed	*tmp = wide;
 	for (i = 0; i < strlen (str) && str[i]; i++){
 		#if defined(__LITTLE_ENDIAN)
-			wide[i] = (u16) str[i];
+			tmp[i].val = (u16) str[i];
 		#elif defined(__BIG_ENDIAN)
-			wide[i] = ((u16)(str[i])<<8);
+			tmp[i].val = ((u16)(str[i])<<8);
 		#else
 			#error "__LITTLE_ENDIAN or __BIG_ENDIAN undefined"
 		#endif