The Linux Kernel Mailing List
 help / color / mirror / Atom feed
* [PATCH] - silence UBSAN complaint in ehci-hcd.
@ 2016-05-19 21:19 Valdis Kletnieks
  2016-05-20  0:50 ` Greg Kroah-Hartman
  2016-05-20 14:34 ` Alan Stern
  0 siblings, 2 replies; 5+ messages in thread
From: Valdis Kletnieks @ 2016-05-19 21:19 UTC (permalink / raw)
  To: Alan Stern, Andrey Ryabinin
  Cc: Oliver Neukum, Greg Kroah-Hartman, linux-kernel, linux-usb

UBSAN throws a complaint:

[    2.418579] UBSAN: Undefined behaviour in drivers/usb/host/ehci-hub.c:877:47
[    2.418582] index -1 is out of range for type 'u32 [1]'

though it's only on the hostpc[] part, not  on the port_status[] on the
previous line which has the same exact index calculation.  The root cause is
that the first declaration is port_status[0], which uses a GCC extension and
UBSAN is smart enough to realize the programmer is doing something
intentionally odd.

However, the problematic declaration is hostpc[1], which doesn't have
the "I know what I'm doing" semantics of [0].  Change the declaration to match.

Signed-Off-By: Valdis Kletnieks <valdis.kletnieks@vt.edu>

--- a/include/linux/usb/ehci_def.h	2015-01-06 01:04:24.342436706 -0500
+++ b/include/linux/usb/ehci_def.h	2016-05-19 13:57:20.869304540 -0400
@@ -180,11 +180,11 @@ struct ehci_regs {
  * PORTSCx
  */
 	/* HOSTPC: offset 0x84 */
-	u32		hostpc[1];	/* HOSTPC extension */
+	u32		hostpc[0];	/* HOSTPC extension */
 #define HOSTPC_PHCD	(1<<22)		/* Phy clock disable */
 #define HOSTPC_PSPD	(3<<25)		/* Port speed detection */
 
-	u32		reserved5[16];
+	u32		reserved5[17];
 
 	/* USBMODE_EX: offset 0xc8 */
 	u32		usbmode_ex;	/* USB Device mode extension */

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] - silence UBSAN complaint in ehci-hcd.
  2016-05-19 21:19 [PATCH] - silence UBSAN complaint in ehci-hcd Valdis Kletnieks
@ 2016-05-20  0:50 ` Greg Kroah-Hartman
  2016-05-20  0:59   ` Valdis.Kletnieks
  2016-05-20 14:34 ` Alan Stern
  1 sibling, 1 reply; 5+ messages in thread
From: Greg Kroah-Hartman @ 2016-05-20  0:50 UTC (permalink / raw)
  To: Valdis Kletnieks
  Cc: Alan Stern, Andrey Ryabinin, Oliver Neukum, linux-kernel,
	linux-usb

On Thu, May 19, 2016 at 05:19:00PM -0400, Valdis Kletnieks wrote:
> UBSAN throws a complaint:
> 
> [    2.418579] UBSAN: Undefined behaviour in drivers/usb/host/ehci-hub.c:877:47
> [    2.418582] index -1 is out of range for type 'u32 [1]'
> 
> though it's only on the hostpc[] part, not  on the port_status[] on the
> previous line which has the same exact index calculation.  The root cause is
> that the first declaration is port_status[0], which uses a GCC extension and
> UBSAN is smart enough to realize the programmer is doing something
> intentionally odd.
> 
> However, the problematic declaration is hostpc[1], which doesn't have
> the "I know what I'm doing" semantics of [0].  Change the declaration to match.
> 
> Signed-Off-By: Valdis Kletnieks <valdis.kletnieks@vt.edu>
> 
> --- a/include/linux/usb/ehci_def.h	2015-01-06 01:04:24.342436706 -0500
> +++ b/include/linux/usb/ehci_def.h	2016-05-19 13:57:20.869304540 -0400
> @@ -180,11 +180,11 @@ struct ehci_regs {
>   * PORTSCx
>   */
>  	/* HOSTPC: offset 0x84 */
> -	u32		hostpc[1];	/* HOSTPC extension */
> +	u32		hostpc[0];	/* HOSTPC extension */
>  #define HOSTPC_PHCD	(1<<22)		/* Phy clock disable */
>  #define HOSTPC_PSPD	(3<<25)		/* Port speed detection */

Hm, this is odd, you really do want hostpc to be 1 u32 value, don't make
it 0 please.  If you walk off the end of hostpc, well, let's fix that
properly.

And are you sure this is needed?  Is this a different issue from the
other long thread right now that we finally got a patch for?

thanks,

greg k-h

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] - silence UBSAN complaint in ehci-hcd.
  2016-05-20  0:50 ` Greg Kroah-Hartman
@ 2016-05-20  0:59   ` Valdis.Kletnieks
  2016-05-20 14:37     ` Alan Stern
  0 siblings, 1 reply; 5+ messages in thread
From: Valdis.Kletnieks @ 2016-05-20  0:59 UTC (permalink / raw)
  To: Greg Kroah-Hartman
  Cc: Alan Stern, Andrey Ryabinin, Oliver Neukum, linux-kernel,
	linux-usb

[-- Attachment #1: Type: text/plain, Size: 1804 bytes --]

On Thu, 19 May 2016 17:50:31 -0700, Greg Kroah-Hartman said:
> On Thu, May 19, 2016 at 05:19:00PM -0400, Valdis Kletnieks wrote:
> > UBSAN throws a complaint:
> >
> > [    2.418579] UBSAN: Undefined behaviour in drivers/usb/host/ehci-hub.c:877:47
> > [    2.418582] index -1 is out of range for type 'u32 [1]'
> >
> > though it's only on the hostpc[] part, not  on the port_status[] on the
> > previous line which has the same exact index calculation.  The root cause is
> > that the first declaration is port_status[0], which uses a GCC extension and
> > UBSAN is smart enough to realize the programmer is doing something
> > intentionally odd.
> >
> > However, the problematic declaration is hostpc[1], which doesn't have
> > the "I know what I'm doing" semantics of [0].  Change the declaration to match.
> >
> > Signed-Off-By: Valdis Kletnieks <valdis.kletnieks@vt.edu>
> >
> > --- a/include/linux/usb/ehci_def.h	2015-01-06 01:04:24.342436706 -0500
> > +++ b/include/linux/usb/ehci_def.h	2016-05-19 13:57:20.869304540 -0400
> > @@ -180,11 +180,11 @@ struct ehci_regs {
> >   * PORTSCx
> >   */
> >  	/* HOSTPC: offset 0x84 */
> > -	u32		hostpc[1];	/* HOSTPC extension */
> > +	u32		hostpc[0];	/* HOSTPC extension */
> >  #define HOSTPC_PHCD	(1<<22)		/* Phy clock disable */
> >  #define HOSTPC_PSPD	(3<<25)		/* Port speed detection */
>
> Hm, this is odd, you really do want hostpc to be 1 u32 value, don't make
> it 0 please.  If you walk off the end of hostpc, well, let's fix that
> properly.

Well, UBSAN doesn't complain about the *other* use of the same exact index,
apparently because 'u32 port_status[0]' tells it to shut up we know what we're
doing.

And I'm pretty sure that if hostpc was supposed to be exactly one u32 rather
than an array, it wouldn't have the [] semantics everyplace...

[-- Attachment #2: Type: application/pgp-signature, Size: 848 bytes --]

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] - silence UBSAN complaint in ehci-hcd.
  2016-05-19 21:19 [PATCH] - silence UBSAN complaint in ehci-hcd Valdis Kletnieks
  2016-05-20  0:50 ` Greg Kroah-Hartman
@ 2016-05-20 14:34 ` Alan Stern
  1 sibling, 0 replies; 5+ messages in thread
From: Alan Stern @ 2016-05-20 14:34 UTC (permalink / raw)
  To: Valdis Kletnieks
  Cc: Andrey Ryabinin, Oliver Neukum, Greg Kroah-Hartman, linux-kernel,
	linux-usb

On Thu, 19 May 2016, Valdis Kletnieks wrote:

> UBSAN throws a complaint:
> 
> [    2.418579] UBSAN: Undefined behaviour in drivers/usb/host/ehci-hub.c:877:47
> [    2.418582] index -1 is out of range for type 'u32 [1]'
> 
> though it's only on the hostpc[] part, not  on the port_status[] on the
> previous line which has the same exact index calculation.  The root cause is
> that the first declaration is port_status[0], which uses a GCC extension and
> UBSAN is smart enough to realize the programmer is doing something
> intentionally odd.
> 
> However, the problematic declaration is hostpc[1], which doesn't have
> the "I know what I'm doing" semantics of [0].  Change the declaration to match.
> 
> Signed-Off-By: Valdis Kletnieks <valdis.kletnieks@vt.edu>
> 
> --- a/include/linux/usb/ehci_def.h	2015-01-06 01:04:24.342436706 -0500
> +++ b/include/linux/usb/ehci_def.h	2016-05-19 13:57:20.869304540 -0400
> @@ -180,11 +180,11 @@ struct ehci_regs {
>   * PORTSCx
>   */
>  	/* HOSTPC: offset 0x84 */
> -	u32		hostpc[1];	/* HOSTPC extension */
> +	u32		hostpc[0];	/* HOSTPC extension */
>  #define HOSTPC_PHCD	(1<<22)		/* Phy clock disable */
>  #define HOSTPC_PSPD	(3<<25)		/* Port speed detection */
>  
> -	u32		reserved5[16];
> +	u32		reserved5[17];
>  
>  	/* USBMODE_EX: offset 0xc8 */
>  	u32		usbmode_ex;	/* USB Device mode extension */

Is this problem still present with my latest patch 
(http://marc.info/?l=linux-usb&m=146368979514228&w=2)?

I agree that this is a reasonable change to make in any case.

Alan Stern

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] - silence UBSAN complaint in ehci-hcd.
  2016-05-20  0:59   ` Valdis.Kletnieks
@ 2016-05-20 14:37     ` Alan Stern
  0 siblings, 0 replies; 5+ messages in thread
From: Alan Stern @ 2016-05-20 14:37 UTC (permalink / raw)
  To: Valdis.Kletnieks
  Cc: Greg Kroah-Hartman, Andrey Ryabinin, Oliver Neukum, linux-kernel,
	linux-usb

On Thu, 19 May 2016 Valdis.Kletnieks@vt.edu wrote:

> On Thu, 19 May 2016 17:50:31 -0700, Greg Kroah-Hartman said:
> > On Thu, May 19, 2016 at 05:19:00PM -0400, Valdis Kletnieks wrote:
> > > UBSAN throws a complaint:
> > >
> > > [    2.418579] UBSAN: Undefined behaviour in drivers/usb/host/ehci-hub.c:877:47
> > > [    2.418582] index -1 is out of range for type 'u32 [1]'
> > >
> > > though it's only on the hostpc[] part, not  on the port_status[] on the
> > > previous line which has the same exact index calculation.  The root cause is
> > > that the first declaration is port_status[0], which uses a GCC extension and
> > > UBSAN is smart enough to realize the programmer is doing something
> > > intentionally odd.
> > >
> > > However, the problematic declaration is hostpc[1], which doesn't have
> > > the "I know what I'm doing" semantics of [0].  Change the declaration to match.
> > >
> > > Signed-Off-By: Valdis Kletnieks <valdis.kletnieks@vt.edu>
> > >
> > > --- a/include/linux/usb/ehci_def.h	2015-01-06 01:04:24.342436706 -0500
> > > +++ b/include/linux/usb/ehci_def.h	2016-05-19 13:57:20.869304540 -0400
> > > @@ -180,11 +180,11 @@ struct ehci_regs {
> > >   * PORTSCx
> > >   */
> > >  	/* HOSTPC: offset 0x84 */
> > > -	u32		hostpc[1];	/* HOSTPC extension */
> > > +	u32		hostpc[0];	/* HOSTPC extension */
> > >  #define HOSTPC_PHCD	(1<<22)		/* Phy clock disable */
> > >  #define HOSTPC_PSPD	(3<<25)		/* Port speed detection */
> >
> > Hm, this is odd, you really do want hostpc to be 1 u32 value, don't make
> > it 0 please.  If you walk off the end of hostpc, well, let's fix that
> > properly.
> 
> Well, UBSAN doesn't complain about the *other* use of the same exact index,
> apparently because 'u32 port_status[0]' tells it to shut up we know what we're
> doing.
> 
> And I'm pretty sure that if hostpc was supposed to be exactly one u32 rather
> than an array, it wouldn't have the [] semantics everyplace...

hostpc is supposed to have the same number of elements as the number of 
ports.  (On the other hand, I'm not sure if any of the platforms which 
implement the hostpc register have more than one port...)

Alan Stern

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2016-05-20 14:37 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-05-19 21:19 [PATCH] - silence UBSAN complaint in ehci-hcd Valdis Kletnieks
2016-05-20  0:50 ` Greg Kroah-Hartman
2016-05-20  0:59   ` Valdis.Kletnieks
2016-05-20 14:37     ` Alan Stern
2016-05-20 14:34 ` Alan Stern

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox