Commit fe4b65ec authored by Oliver Neukum's avatar Oliver Neukum Committed by Greg Kroah-Hartman

mos7720 update

this driver has an interesting way of handling ENOMEM: complain and ignore.
If you decide to live with allocation failures, you must

1. guard against URBs without corresponding buffers
2. complete allocation failures
3. always test entries for NULL before you follow the pointers

This patch does so.
Signed-off-by: default avatarOliver Neukum <oneukum@suse.de>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 7378c57a
...@@ -333,6 +333,7 @@ static int mos7720_open(struct usb_serial_port *port, struct file * filp) ...@@ -333,6 +333,7 @@ static int mos7720_open(struct usb_serial_port *port, struct file * filp)
int response; int response;
int port_number; int port_number;
char data; char data;
int allocated_urbs = 0;
int j; int j;
serial = port->serial; serial = port->serial;
...@@ -365,10 +366,16 @@ static int mos7720_open(struct usb_serial_port *port, struct file * filp) ...@@ -365,10 +366,16 @@ static int mos7720_open(struct usb_serial_port *port, struct file * filp)
GFP_KERNEL); GFP_KERNEL);
if (!urb->transfer_buffer) { if (!urb->transfer_buffer) {
err("%s-out of memory for urb buffers.", __FUNCTION__); err("%s-out of memory for urb buffers.", __FUNCTION__);
usb_free_urb(mos7720_port->write_urb_pool[j]);
mos7720_port->write_urb_pool[j] = NULL;
continue; continue;
} }
allocated_urbs++;
} }
if (!allocated_urbs)
return -ENOMEM;
/* Initialize MCS7720 -- Write Init values to corresponding Registers /* Initialize MCS7720 -- Write Init values to corresponding Registers
* *
* Register Index * Register Index
...@@ -526,7 +533,7 @@ static int mos7720_chars_in_buffer(struct usb_serial_port *port) ...@@ -526,7 +533,7 @@ static int mos7720_chars_in_buffer(struct usb_serial_port *port)
} }
for (i = 0; i < NUM_URBS; ++i) { for (i = 0; i < NUM_URBS; ++i) {
if (mos7720_port->write_urb_pool[i]->status == -EINPROGRESS) if (mos7720_port->write_urb_pool[i] && mos7720_port->write_urb_pool[i]->status == -EINPROGRESS)
chars += URB_TRANSFER_BUFFER_SIZE; chars += URB_TRANSFER_BUFFER_SIZE;
} }
dbg("%s - returns %d", __FUNCTION__, chars); dbg("%s - returns %d", __FUNCTION__, chars);
...@@ -629,7 +636,7 @@ static int mos7720_write_room(struct usb_serial_port *port) ...@@ -629,7 +636,7 @@ static int mos7720_write_room(struct usb_serial_port *port)
} }
for (i = 0; i < NUM_URBS; ++i) { for (i = 0; i < NUM_URBS; ++i) {
if (mos7720_port->write_urb_pool[i]->status != -EINPROGRESS) if (mos7720_port->write_urb_pool[i] && mos7720_port->write_urb_pool[i]->status != -EINPROGRESS)
room += URB_TRANSFER_BUFFER_SIZE; room += URB_TRANSFER_BUFFER_SIZE;
} }
...@@ -664,7 +671,7 @@ static int mos7720_write(struct usb_serial_port *port, ...@@ -664,7 +671,7 @@ static int mos7720_write(struct usb_serial_port *port,
urb = NULL; urb = NULL;
for (i = 0; i < NUM_URBS; ++i) { for (i = 0; i < NUM_URBS; ++i) {
if (mos7720_port->write_urb_pool[i]->status != -EINPROGRESS) { if (mos7720_port->write_urb_pool[i] && mos7720_port->write_urb_pool[i]->status != -EINPROGRESS) {
urb = mos7720_port->write_urb_pool[i]; urb = mos7720_port->write_urb_pool[i];
dbg("URB:%d",i); dbg("URB:%d",i);
break; break;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment