Re: [PATCH] Fix oops on close of hot-unplugged FTDI serial converter

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

 



On Mon, May 18, 2009 at 12:53:15AM +0100, David Woodhouse wrote:
> When the device is removed, ftdi_sio_port_remove() calls
> usb_set_serial_port_data(port, NULL).
> 
> When userspace subsequently _closes_ the device, ftdi_close() oopses on
> dereferencing that NULL pointer.
> 
> The fix is just not to clear the private data in ftdi_sio_port_remove().
> The refcount on the structure reaches zero when the port is closed by
> userspace and the final kref_put() happens in ftdi_close().
> 
> Remove a bogus comment too, while we're at it. And stop doing things
> inside "if (priv)" -- it must _always_ be there.
> 
> Based loosely on an earlier patch by Daniel Mack, and suggestions by
> Alan Stern.
> 
> Signed-off-by: David Woodhouse <David.Woodhouse@xxxxxxxxx>

Tested-by: Daniel Mack <daniel@xxxxxxxx>

> ---
> Wants backporting to 2.6.29 in some form -- maybe a naïve 'if (priv)' in
> fdti_close() is the right thing to do there?
> 
> diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c
> index 0ab8474..452a61c 100644
> --- a/drivers/usb/serial/ftdi_sio.c
> +++ b/drivers/usb/serial/ftdi_sio.c
> @@ -1487,14 +1488,7 @@ static int ftdi_sio_port_remove(struct usb_serial_port *port)
>  
>  	remove_sysfs_attrs(port);
>  
> -	/* all open ports are closed at this point
> -	 *    (by usbserial.c:__serial_close, which calls ftdi_close)
> -	 */
> -
> -	if (priv) {
> -		usb_set_serial_port_data(port, NULL);
> -		kref_put(&priv->kref, ftdi_sio_priv_release);
> -	}
> +	kref_put(&priv->kref, ftdi_sio_priv_release);
>  
>  	return 0;
>  }
> 
> -- 
> David Woodhouse                            Open Source Technology Centre
> David.Woodhouse@xxxxxxxxx                              Intel Corporation
> 
--
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