diff options
author | Jesper Juhl <jj@chaosbits.net> | 2012-08-07 11:56:26 +0000 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2012-08-08 16:04:47 -0700 |
commit | 47dffc7547ed3b105dabd570ed864347687beac2 (patch) | |
tree | 92cedaf0ddd3ea1e6d7c18dae57f3f268852cf42 /drivers/net/usb/cdc-phonet.c | |
parent | 155e4e12b9f49c2dc817bb4c44e9416c46833c3d (diff) | |
download | op-kernel-dev-47dffc7547ed3b105dabd570ed864347687beac2.zip op-kernel-dev-47dffc7547ed3b105dabd570ed864347687beac2.tar.gz |
cdc-phonet: Don't leak in usbpn_open
We allocate memory for 'req' with usb_alloc_urb() and then test
'if (!req || rx_submit(pnd, req, GFP_KERNEL | __GFP_COLD))'.
If we enter that branch due to '!req' then there is no problem. But if
we enter the branch due to 'req' being != 0 and the 'rx_submit()' call
being false, then we'll leak the memory we allocated.
Deal with the leak by always calling 'usb_free_urb(req)' when entering
the branch. If 'req' happens to be 0 then the call is harmless, if it
is not 0 then we free the memory we allocated but don't need.
Signed-off-by: Jesper Juhl <jj@chaosbits.net>
Acked-by: RĂ©mi Denis-Courmont <remi@remlab.net>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/usb/cdc-phonet.c')
-rw-r--r-- | drivers/net/usb/cdc-phonet.c | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/drivers/net/usb/cdc-phonet.c b/drivers/net/usb/cdc-phonet.c index 6461004..7d78669 100644 --- a/drivers/net/usb/cdc-phonet.c +++ b/drivers/net/usb/cdc-phonet.c @@ -232,6 +232,7 @@ static int usbpn_open(struct net_device *dev) struct urb *req = usb_alloc_urb(0, GFP_KERNEL); if (!req || rx_submit(pnd, req, GFP_KERNEL | __GFP_COLD)) { + usb_free_urb(req); usbpn_close(dev); return -ENOMEM; } |