X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=drivers%2Fusb%2Fserial%2Fir-usb.c;h=3d1571695bde33b94e6b0b393e7bf7ae1917084c;hb=9e1bf581d67d87a1d7fc0ea500729e3a03643a26;hp=3003cd04300ef401c31f95433ad976dd9f82a580;hpb=8d40237c730b8be87c1b80a5d96b9c603fefa829;p=linux-2.6.git diff --git a/drivers/usb/serial/ir-usb.c b/drivers/usb/serial/ir-usb.c index 3003cd043..3d1571695 100644 --- a/drivers/usb/serial/ir-usb.c +++ b/drivers/usb/serial/ir-usb.c @@ -105,7 +105,7 @@ static int xbof = -1; static int ir_startup (struct usb_serial *serial); static int ir_open (struct usb_serial_port *port, struct file *filep); static void ir_close (struct usb_serial_port *port, struct file *filep); -static int ir_write (struct usb_serial_port *port, const unsigned char *buf, int count); +static int ir_write (struct usb_serial_port *port, int from_user, const unsigned char *buf, int count); static void ir_write_bulk_callback (struct urb *urb, struct pt_regs *regs); static void ir_read_bulk_callback (struct urb *urb, struct pt_regs *regs); static void ir_set_termios (struct usb_serial_port *port, struct termios *old_termios); @@ -322,10 +322,10 @@ static void ir_close (struct usb_serial_port *port, struct file * filp) dbg("%s - port %d", __FUNCTION__, port->number); /* shutdown our bulk read */ - usb_kill_urb(port->read_urb); + usb_unlink_urb (port->read_urb); } -static int ir_write (struct usb_serial_port *port, const unsigned char *buf, int count) +static int ir_write (struct usb_serial_port *port, int from_user, const unsigned char *buf, int count) { unsigned char *transfer_buffer; int result; @@ -359,7 +359,12 @@ static int ir_write (struct usb_serial_port *port, const unsigned char *buf, int *transfer_buffer = ir_xbof | ir_baud; ++transfer_buffer; - memcpy (transfer_buffer, buf, transfer_size); + if (from_user) { + if (copy_from_user (transfer_buffer, buf, transfer_size)) + return -EFAULT; + } else { + memcpy (transfer_buffer, buf, transfer_size); + } usb_fill_bulk_urb ( port->write_urb,