X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=drivers%2Fusb%2Fserial%2Fomninet.c;h=371aa2e8e3f1ea52c05dd142a3d24d0497f0d144;hb=9e1bf581d67d87a1d7fc0ea500729e3a03643a26;hp=a1cba4b5fa2352243b48c363afb485d07db275d9;hpb=8d40237c730b8be87c1b80a5d96b9c603fefa829;p=linux-2.6.git diff --git a/drivers/usb/serial/omninet.c b/drivers/usb/serial/omninet.c index a1cba4b5f..371aa2e8e 100644 --- a/drivers/usb/serial/omninet.c +++ b/drivers/usb/serial/omninet.c @@ -67,7 +67,7 @@ static int omninet_open (struct usb_serial_port *port, struct file *filp); static void omninet_close (struct usb_serial_port *port, struct file *filp); static void omninet_read_bulk_callback (struct urb *urb, struct pt_regs *regs); static void omninet_write_bulk_callback (struct urb *urb, struct pt_regs *regs); -static int omninet_write (struct usb_serial_port *port, const unsigned char *buf, int count); +static int omninet_write (struct usb_serial_port *port, int from_user, const unsigned char *buf, int count); static int omninet_write_room (struct usb_serial_port *port); static void omninet_shutdown (struct usb_serial *serial); @@ -183,8 +183,8 @@ static void omninet_close (struct usb_serial_port *port, struct file * filp) dbg("%s - port %d", __FUNCTION__, port->number); wport = serial->port[1]; - usb_kill_urb(wport->write_urb); - usb_kill_urb(port->read_urb); + usb_unlink_urb(wport->write_urb); + usb_unlink_urb(port->read_urb); od = usb_get_serial_port_data(port); if (od) @@ -241,7 +241,7 @@ static void omninet_read_bulk_callback (struct urb *urb, struct pt_regs *regs) return; } -static int omninet_write (struct usb_serial_port *port, const unsigned char *buf, int count) +static int omninet_write (struct usb_serial_port *port, int from_user, const unsigned char *buf, int count) { struct usb_serial *serial = port->serial; struct usb_serial_port *wport = serial->port[1]; @@ -264,7 +264,15 @@ static int omninet_write (struct usb_serial_port *port, const unsigned char *buf count = (count > OMNINET_BULKOUTSIZE) ? OMNINET_BULKOUTSIZE : count; - memcpy (wport->write_urb->transfer_buffer + OMNINET_DATAOFFSET, buf, count); + if (from_user) { + if (copy_from_user(wport->write_urb->transfer_buffer + OMNINET_DATAOFFSET, buf, count) != 0) { + result = -EFAULT; + goto exit; + } + } + else { + memcpy (wport->write_urb->transfer_buffer + OMNINET_DATAOFFSET, buf, count); + } usb_serial_debug_data(debug, &port->dev, __FUNCTION__, count, wport->write_urb->transfer_buffer); @@ -283,6 +291,7 @@ static int omninet_write (struct usb_serial_port *port, const unsigned char *buf else result = count; +exit: return result; }