aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohan Hovold <johan@kernel.org>2016-05-08 14:07:57 -0400
committerJohan Hovold <johan@kernel.org>2016-05-10 03:39:30 -0400
commitc8d62957d450cc1a22ce3242908709fe367ddc8e (patch)
tree255ab9aafe012abcefae82d9e9500c2eda951f85
parentc5c0c55598cefc826d6cfb0a417eeaee3631715c (diff)
USB: serial: io_edgeport: fix memory leaks in probe error path
URBs and buffers allocated in attach for Epic devices would never be deallocated in case of a later probe error (e.g. failure to allocate minor numbers) as disconnect is then never called. Fix by moving deallocation to release and making sure that the URBs are first unlinked. Fixes: f9c99bb8b3a1 ("USB: usb-serial: replace shutdown with disconnect, release") Cc: stable <stable@vger.kernel.org> # v2.6.31 Signed-off-by: Johan Hovold <johan@kernel.org> Acked-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r--drivers/usb/serial/io_edgeport.c17
1 files changed, 10 insertions, 7 deletions
diff --git a/drivers/usb/serial/io_edgeport.c b/drivers/usb/serial/io_edgeport.c
index edd568bc0de5..11c05ce2f35f 100644
--- a/drivers/usb/serial/io_edgeport.c
+++ b/drivers/usb/serial/io_edgeport.c
@@ -2959,16 +2959,9 @@ static void edge_disconnect(struct usb_serial *serial)
2959{ 2959{
2960 struct edgeport_serial *edge_serial = usb_get_serial_data(serial); 2960 struct edgeport_serial *edge_serial = usb_get_serial_data(serial);
2961 2961
2962 /* stop reads and writes on all ports */
2963 /* free up our endpoint stuff */
2964 if (edge_serial->is_epic) { 2962 if (edge_serial->is_epic) {
2965 usb_kill_urb(edge_serial->interrupt_read_urb); 2963 usb_kill_urb(edge_serial->interrupt_read_urb);
2966 usb_free_urb(edge_serial->interrupt_read_urb);
2967 kfree(edge_serial->interrupt_in_buffer);
2968
2969 usb_kill_urb(edge_serial->read_urb); 2964 usb_kill_urb(edge_serial->read_urb);
2970 usb_free_urb(edge_serial->read_urb);
2971 kfree(edge_serial->bulk_in_buffer);
2972 } 2965 }
2973} 2966}
2974 2967
@@ -2981,6 +2974,16 @@ static void edge_release(struct usb_serial *serial)
2981{ 2974{
2982 struct edgeport_serial *edge_serial = usb_get_serial_data(serial); 2975 struct edgeport_serial *edge_serial = usb_get_serial_data(serial);
2983 2976
2977 if (edge_serial->is_epic) {
2978 usb_kill_urb(edge_serial->interrupt_read_urb);
2979 usb_free_urb(edge_serial->interrupt_read_urb);
2980 kfree(edge_serial->interrupt_in_buffer);
2981
2982 usb_kill_urb(edge_serial->read_urb);
2983 usb_free_urb(edge_serial->read_urb);
2984 kfree(edge_serial->bulk_in_buffer);
2985 }
2986
2984 kfree(edge_serial); 2987 kfree(edge_serial);
2985} 2988}
2986 2989