Re: [PATCH 1/2] staging: usbip: cleanup and fix of vhci_hub_status

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, Jun 12, 2012 at 04:16:01PM -0400, Bart Westgeest wrote:
> Changed setting the status bits to a byte-oriented approach. Number of
> written status bits is now based on VHCI_NPORT, instead of casting
> status buffer to a long. This fixes a stack corruption bug on 64-bit
> based architectures, and potential byte order / endianness related
> issues.
> 
> In addition updated function comments, and log statements.
> 
> Signed-off-by: Bart Westgeest <bart@xxxxxxxxxx>
> ---
>  drivers/staging/usbip/vhci_hcd.c |   39 +++++++++++---------------------------
>  1 file changed, 11 insertions(+), 28 deletions(-)
> 
> diff --git a/drivers/staging/usbip/vhci_hcd.c b/drivers/staging/usbip/vhci_hcd.c
> index f708cba..e2e5ae1 100644
> --- a/drivers/staging/usbip/vhci_hcd.c
> +++ b/drivers/staging/usbip/vhci_hcd.c
> @@ -178,44 +178,32 @@ void rh_port_disconnect(int rhport)
>  	  | USB_PORT_STAT_C_RESET) << 16)
>  
>  /*
> - * This function is almostly the same as dummy_hcd.c:dummy_hub_status() without
> - * suspend/resume support. But, it is modified to provide multiple ports.
> + * Returns 0 if the status hasn't changed, or the number of bytes in buf.
> + * Ports are 0-indexed from the HCD point of view,
> + * and 1-indexed from the USB core pointer of view.
>   *
>   * @buf: a bitmap to show which port status has been changed.
> - *  bit  0: reserved or used for another purpose?
> + *  bit  0: reserved
>   *  bit  1: the status of port 0 has been changed.
>   *  bit  2: the status of port 1 has been changed.
>   *  ...
> - *  bit  7: the status of port 6 has been changed.
> - *  bit  8: the status of port 7 has been changed.
> - *  ...
> - *  bit 15: the status of port 14 has been changed.
> - *
> - * So, the maximum number of ports is 31 ( port 0 to port 30) ?
> - *
> - * The return value is the actual transferred length in byte. If nothing has
> - * been changed, return 0. In the case that the number of ports is less than or
> - * equal to 6 (VHCI_NPORTS==7), return 1.
> - *
>   */
>  static int vhci_hub_status(struct usb_hcd *hcd, char *buf)
>  {
>  	struct vhci_hcd	*vhci;
>  	unsigned long	flags;
> -	int		retval = 0;
> -
> -	/* the enough buffer is allocated according to USB_MAXCHILDREN */
> -	unsigned long	*event_bits = (unsigned long *) buf;
> +	int		retval;
>  	int		rhport;
>  	int		changed = 0;
>  
> -	*event_bits = 0;
> +	retval = (VHCI_NPORTS + 8) / 8;

What is this for?  Isn't there a "round up" function somewhere already?

> +	memset(buf, 0, retval);
>  
>  	vhci = hcd_to_vhci(hcd);
>  
>  	spin_lock_irqsave(&vhci->lock, flags);
>  	if (!HCD_HW_ACCESSIBLE(hcd)) {
> -		usbip_dbg_vhci_rh("hw accessible flag in on?\n");
> +		usbip_dbg_vhci_rh("hw accessible flag not on?\n");
>  		goto done;
>  	}
>  
> @@ -223,9 +211,9 @@ static int vhci_hub_status(struct usb_hcd *hcd, char *buf)
>  	for (rhport = 0; rhport < VHCI_NPORTS; rhport++) {
>  		if ((vhci->port_status[rhport] & PORT_C_MASK)) {
>  			/* The status of a port has been changed, */
> -			usbip_dbg_vhci_rh("port %d is changed\n", rhport);
> +			usbip_dbg_vhci_rh("port %d status changed\n", rhport);
>  
> -			*event_bits |= 1 << (rhport + 1);
> +			buf[(rhport + 1) / 8] |= 1 << (rhport + 1) % 8;
>  			changed = 1;
>  		}
>  	}
> @@ -235,14 +223,9 @@ static int vhci_hub_status(struct usb_hcd *hcd, char *buf)
>  	if (hcd->state == HC_STATE_SUSPENDED)
>  		usb_hcd_resume_root_hub(hcd);
>  
> -	if (changed)
> -		retval = 1 + (VHCI_NPORTS / 8);
> -	else
> -		retval = 0;
> -
>  done:
>  	spin_unlock_irqrestore(&vhci->lock, flags);
> -	return retval;
> +	return changed ? retval : 0;

You didn't fix this like I asked you to :(

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


[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux