Re: [PATCH v1 1/1] USB: serial: Add boundry check for read_urbs array access

2018-03-08 Thread sathyanarayanan kuppuswamy



On 03/08/2018 03:43 PM, Greg KH wrote:

On Thu, Mar 08, 2018 at 03:29:48PM -0800, sathyanarayanan kuppuswamy wrote:


On 03/08/2018 12:54 AM, Oliver Neukum wrote:

Am Mittwoch, den 07.03.2018, 13:41 -0800 schrieb sathyanarayanan
kuppuswamy   :

On 03/07/2018 12:58 PM, Greg KH wrote:

So I don't see why your check is needed, what other code path would ever
call this function in a way that the bounds check would be needed?

void usb_serial_generic_read_bulk_callback(struct urb *urb)

385 for (i = 0; i < ARRAY_SIZE(port->read_urbs); ++i) {
386 if (urb == port->read_urbs[i])
387 break;
388 }

In here, after this for loop is done (without any matching urb), i value
will be equal to ARRAY_SIZE(port->read_urbs). So there is a possibility
of usb_serial_generic_submit_read_urb() getting called with this invalid
index.

If this happens the function was called for a stray URB.
Your check comes to late. We have called set_bit with an invalid index
and other shit.
We definitely do not just want to return an error in that case.

In that case do you think we should use some WARN_ON() for invalid index in
usb_serial_generic_read_bulk_callback()?

No, again, how could that ever happen?

Don't add pointless error checking for things that are impossible to
ever hit :)

Thanks Greg.


thanks,

greg k-h
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html



--
Sathyanarayanan Kuppuswamy
Linux kernel developer



Re: [PATCH v1 1/1] USB: serial: Add boundry check for read_urbs array access

2018-03-08 Thread Greg KH
On Thu, Mar 08, 2018 at 03:29:48PM -0800, sathyanarayanan kuppuswamy wrote:
> 
> 
> On 03/08/2018 12:54 AM, Oliver Neukum wrote:
> > Am Mittwoch, den 07.03.2018, 13:41 -0800 schrieb sathyanarayanan
> > kuppuswamy   :
> > > On 03/07/2018 12:58 PM, Greg KH wrote:
> > > > So I don't see why your check is needed, what other code path would ever
> > > > call this function in a way that the bounds check would be needed?
> > > void usb_serial_generic_read_bulk_callback(struct urb *urb)
> > > 
> > > 385 for (i = 0; i < ARRAY_SIZE(port->read_urbs); ++i) {
> > > 386 if (urb == port->read_urbs[i])
> > > 387 break;
> > > 388 }
> > > 
> > > In here, after this for loop is done (without any matching urb), i value
> > > will be equal to ARRAY_SIZE(port->read_urbs). So there is a possibility
> > > of usb_serial_generic_submit_read_urb() getting called with this invalid
> > > index.
> > If this happens the function was called for a stray URB.
> > Your check comes to late. We have called set_bit with an invalid index
> > and other shit.
> > We definitely do not just want to return an error in that case.
> In that case do you think we should use some WARN_ON() for invalid index in
> usb_serial_generic_read_bulk_callback()?

No, again, how could that ever happen?

Don't add pointless error checking for things that are impossible to
ever hit :)

thanks,

greg k-h


Re: [PATCH v1 1/1] USB: serial: Add boundry check for read_urbs array access

2018-03-08 Thread sathyanarayanan kuppuswamy



On 03/08/2018 12:54 AM, Oliver Neukum wrote:

Am Mittwoch, den 07.03.2018, 13:41 -0800 schrieb sathyanarayanan
kuppuswamy   :

On 03/07/2018 12:58 PM, Greg KH wrote:

So I don't see why your check is needed, what other code path would ever
call this function in a way that the bounds check would be needed?

void usb_serial_generic_read_bulk_callback(struct urb *urb)

385 for (i = 0; i < ARRAY_SIZE(port->read_urbs); ++i) {
386 if (urb == port->read_urbs[i])
387 break;
388 }

In here, after this for loop is done (without any matching urb), i value
will be equal to ARRAY_SIZE(port->read_urbs). So there is a possibility
of usb_serial_generic_submit_read_urb() getting called with this invalid
index.

If this happens the function was called for a stray URB.
Your check comes to late. We have called set_bit with an invalid index
and other shit.
We definitely do not just want to return an error in that case.
In that case do you think we should use some WARN_ON() for invalid index 
in usb_serial_generic_read_bulk_callback()?


Regards
Oliver

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html



--
Sathyanarayanan Kuppuswamy
Linux kernel developer



Re: [PATCH v1 1/1] USB: serial: Add boundry check for read_urbs array access

2018-03-08 Thread Greg KH
On Wed, Mar 07, 2018 at 01:41:51PM -0800, sathyanarayanan kuppuswamy wrote:
> 
> 
> On 03/07/2018 12:58 PM, Greg KH wrote:
> > On Wed, Mar 07, 2018 at 12:23:56PM -0800, 
> > sathyanarayanan.kuppusw...@linux.intel.com wrote:
> > > From: Kuppuswamy Sathyanarayanan 
> > > 
> > > 
> > > In usb_serial_generic_submit_read_urb() function we are accessing the
> > > port->read_urbs array without any boundry checks. This might lead to
> > > kernel panic when index value goes above array length.
> > > 
> > > One posible call path for this issue is,
> > > 
> > > usb_serial_generic_read_bulk_callback()
> > > {
> > >   ...
> > >   if (!port->throttled) {
> > >   usb_serial_generic_submit_read_urb(port, i, GFP_ATOMIC);
> > >   ...
> > > }
> > How does i ever get to be greater than the array size here in this
> > function?  It directly came from looking in that array in the first
> > place :)
> > 
> > So I don't see why your check is needed, what other code path would ever
> > call this function in a way that the bounds check would be needed?
> void usb_serial_generic_read_bulk_callback(struct urb *urb)
> 
> 385 for (i = 0; i < ARRAY_SIZE(port->read_urbs); ++i) {
> 386 if (urb == port->read_urbs[i])
> 387 break;
> 388 }
> 
> In here, after this for loop is done (without any matching urb),

How is it possible to not have any matching urbs here?  If that ever
happens, we have much worse problems happening in the USB stack :)

thanks,

greg k-h


Re: [PATCH v1 1/1] USB: serial: Add boundry check for read_urbs array access

2018-03-08 Thread Oliver Neukum
Am Mittwoch, den 07.03.2018, 13:41 -0800 schrieb sathyanarayanan
kuppuswamy   :
> 
> On 03/07/2018 12:58 PM, Greg KH wrote:

> > So I don't see why your check is needed, what other code path would ever
> > call this function in a way that the bounds check would be needed?
> void usb_serial_generic_read_bulk_callback(struct urb *urb)
> 
> 385 for (i = 0; i < ARRAY_SIZE(port->read_urbs); ++i) {
> 386 if (urb == port->read_urbs[i])
> 387 break;
> 388 }
> 
> In here, after this for loop is done (without any matching urb), i value 
> will be equal to ARRAY_SIZE(port->read_urbs). So there is a possibility 
> of usb_serial_generic_submit_read_urb() getting called with this invalid 
> index.

If this happens the function was called for a stray URB.
Your check comes to late. We have called set_bit with an invalid index
and other shit.
We definitely do not just want to return an error in that case.

Regards
Oliver



Re: [PATCH v1 1/1] USB: serial: Add boundry check for read_urbs array access

2018-03-07 Thread sathyanarayanan kuppuswamy



On 03/07/2018 12:58 PM, Greg KH wrote:

On Wed, Mar 07, 2018 at 12:23:56PM -0800, 
sathyanarayanan.kuppusw...@linux.intel.com wrote:

From: Kuppuswamy Sathyanarayanan 

In usb_serial_generic_submit_read_urb() function we are accessing the
port->read_urbs array without any boundry checks. This might lead to
kernel panic when index value goes above array length.

One posible call path for this issue is,

usb_serial_generic_read_bulk_callback()
{
  ...
  if (!port->throttled) {
usb_serial_generic_submit_read_urb(port, i, GFP_ATOMIC);
  ...
}

How does i ever get to be greater than the array size here in this
function?  It directly came from looking in that array in the first
place :)

So I don't see why your check is needed, what other code path would ever
call this function in a way that the bounds check would be needed?

void usb_serial_generic_read_bulk_callback(struct urb *urb)

385 for (i = 0; i < ARRAY_SIZE(port->read_urbs); ++i) {
386 if (urb == port->read_urbs[i])
387 break;
388 }

In here, after this for loop is done (without any matching urb), i value 
will be equal to ARRAY_SIZE(port->read_urbs). So there is a possibility 
of usb_serial_generic_submit_read_urb() getting called with this invalid 
index.




thanks,

greg k-h
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html



--
Sathyanarayanan Kuppuswamy
Linux kernel developer



Re: [PATCH v1 1/1] USB: serial: Add boundry check for read_urbs array access

2018-03-07 Thread Greg KH
On Wed, Mar 07, 2018 at 12:23:56PM -0800, 
sathyanarayanan.kuppusw...@linux.intel.com wrote:
> From: Kuppuswamy Sathyanarayanan 
> 
> In usb_serial_generic_submit_read_urb() function we are accessing the
> port->read_urbs array without any boundry checks. This might lead to
> kernel panic when index value goes above array length.
> 
> One posible call path for this issue is,
> 
> usb_serial_generic_read_bulk_callback()
> {
>  ...
>  if (!port->throttled) {
>   usb_serial_generic_submit_read_urb(port, i, GFP_ATOMIC);
>  ...
> }

How does i ever get to be greater than the array size here in this
function?  It directly came from looking in that array in the first
place :)

So I don't see why your check is needed, what other code path would ever
call this function in a way that the bounds check would be needed?

thanks,

greg k-h