This is a note to let you know that I've just added the patch titled
USB: metro-usb: fix port-data memory leak
to the 3.6-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
usb-metro-usb-fix-port-data-memory-leak.patch
and it can be found in the queue-3.6 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree,
please let <[email protected]> know about it.
>From 50dde8686eec41bf3d7cbec7a6f76c073ab01903 Mon Sep 17 00:00:00 2001
From: Johan Hovold <[email protected]>
Date: Thu, 25 Oct 2012 10:28:59 +0200
Subject: USB: metro-usb: fix port-data memory leak
From: Johan Hovold <[email protected]>
commit 50dde8686eec41bf3d7cbec7a6f76c073ab01903 upstream.
Fix port-data memory leak by moving port data allocation and
deallocation to port_probe and port_remove.
Since commit 0998d0631001288 (device-core: Ensure drvdata = NULL when no
driver is bound) the port private data is no longer freed at release as
it is no longer accessible.
Note that the call to metrousb_clean (close) in shutdown was redundant.
Compile-only tested.
Signed-off-by: Johan Hovold <[email protected]>
Signed-off-by: Greg Kroah-Hartman <[email protected]>
---
drivers/usb/serial/metro-usb.c | 50 ++++++++++-------------------------------
1 file changed, 13 insertions(+), 37 deletions(-)
--- a/drivers/usb/serial/metro-usb.c
+++ b/drivers/usb/serial/metro-usb.c
@@ -280,51 +280,27 @@ static int metrousb_set_modem_ctrl(struc
return retval;
}
-static void metrousb_shutdown(struct usb_serial *serial)
+static int metrousb_port_probe(struct usb_serial_port *port)
{
- int i = 0;
+ struct metrousb_private *metro_priv;
- dev_dbg(&serial->dev->dev, "%s\n", __func__);
+ metro_priv = kzalloc(sizeof(*metro_priv), GFP_KERNEL);
+ if (!metro_priv)
+ return -ENOMEM;
- /* Stop reading and writing on all ports. */
- for (i = 0; i < serial->num_ports; ++i) {
- /* Close any open urbs. */
- metrousb_cleanup(serial->port[i]);
+ spin_lock_init(&metro_priv->lock);
- /* Free memory. */
- kfree(usb_get_serial_port_data(serial->port[i]));
- usb_set_serial_port_data(serial->port[i], NULL);
+ usb_set_serial_port_data(port, metro_priv);
- dev_dbg(&serial->dev->dev, "%s - freed port number=%d\n",
- __func__, serial->port[i]->number);
- }
+ return 0;
}
-static int metrousb_startup(struct usb_serial *serial)
+static int metrousb_port_remove(struct usb_serial_port *port)
{
struct metrousb_private *metro_priv;
- struct usb_serial_port *port;
- int i = 0;
-
- dev_dbg(&serial->dev->dev, "%s\n", __func__);
- /* Loop through the serial ports setting up the private structures.
- * Currently we only use one port. */
- for (i = 0; i < serial->num_ports; ++i) {
- port = serial->port[i];
-
- /* Declare memory. */
- metro_priv = kzalloc(sizeof(struct metrousb_private),
GFP_KERNEL);
- if (!metro_priv)
- return -ENOMEM;
-
- /* Initialize memory. */
- spin_lock_init(&metro_priv->lock);
- usb_set_serial_port_data(port, metro_priv);
-
- dev_dbg(&serial->dev->dev, "%s - port number=%d\n ",
- __func__, port->number);
- }
+ metro_priv = usb_get_serial_port_data(port);
+ kfree(metro_priv);
return 0;
}
@@ -423,8 +399,8 @@ static struct usb_serial_driver metrousb
.close = metrousb_cleanup,
.read_int_callback = metrousb_read_int_callback,
.write_int_callback = metrousb_write_int_callback,
- .attach = metrousb_startup,
- .release = metrousb_shutdown,
+ .port_probe = metrousb_port_probe,
+ .port_remove = metrousb_port_remove,
.throttle = metrousb_throttle,
.unthrottle = metrousb_unthrottle,
.tiocmget = metrousb_tiocmget,
Patches currently in stable-queue which might be from [email protected] are
queue-3.6/usb-opticon-fix-memory-leak-in-error-path.patch
queue-3.6/usb-omninet-fix-port-data-memory-leak.patch
queue-3.6/usb-keyspan-fix-null-pointer-dereferences-and-memory-leaks.patch
queue-3.6/usb-quatech2-fix-io-after-disconnect.patch
queue-3.6/usb-mos7840-remove-null-urb-submission.patch
queue-3.6/usb-usb-wwan-fix-multiple-memory-leaks-in-error-paths.patch
queue-3.6/usb-mos7840-remove-invalid-disconnect-handling.patch
queue-3.6/usb-whiteheat-fix-memory-leak-in-error-path.patch
queue-3.6/usb-option-fix-interface-data-memory-leak-in-error-path.patch
queue-3.6/usb-metro-usb-fix-port-data-memory-leak.patch
queue-3.6/usb-mos7840-fix-port-device-leak-in-error-path.patch
queue-3.6/usb-mos7840-fix-urb-leak-at-release.patch
queue-3.6/usb-serial-fix-memory-leak-in-sierra_release.patch
queue-3.6/usb-ipw-fix-interface-data-memory-leak-in-error-path.patch
queue-3.6/usb-quatech2-fix-port-data-memory-leaks.patch
queue-3.6/usb-opticon-fix-dma-from-stack.patch
queue-3.6/usb-mct_u232-fix-port-data-memory-leak.patch
queue-3.6/usb-ch341-fix-port-data-memory-leak.patch
queue-3.6/usb-quatech2-fix-memory-leak-in-error-path.patch
queue-3.6/usb-qcserial-fix-interface-data-memory-leak-in-error-path.patch
queue-3.6/usb-sierra-fix-port-data-memory-leak.patch
queue-3.6/usb-whiteheat-fix-port-data-memory-leak.patch
queue-3.6/usb-metro-usb-fix-io-after-disconnect.patch
queue-3.6/usb-digi_acceleport-fix-port-data-memory-leak.patch
queue-3.6/usb-quatech2-fix-close-and-disconnect-urb-handling.patch
queue-3.6/usb-sierra-fix-memory-leak-in-probe-error-path.patch
queue-3.6/usb-mos7720-fix-port-data-memory-leak.patch
queue-3.6/usb-mct_u232-fix-broken-close.patch
queue-3.6/usb-sierra-fix-memory-leak-in-attach-error-path.patch
--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html