summaryrefslogtreecommitdiffstats
path: root/drivers/usb/gadget/ether.c
diff options
context:
space:
mode:
authorVitaly Kuzmichev <vkuzmichev@mvista.com>2010-08-13 17:02:29 +0400
committerRemy Bohmer <linux@bohmer.net>2010-09-20 21:57:17 +0200
commitd5292c1647d3a711a05ac99ab2077698b3b4a8a0 (patch)
treeeaa9170717e18596830137b766e1e6def1900ef6 /drivers/usb/gadget/ether.c
parentdf559c1d21ba1a9ee0dcec57567907888484d877 (diff)
downloadbootable_bootloader_goldelico_gta04-d5292c1647d3a711a05ac99ab2077698b3b4a8a0.zip
bootable_bootloader_goldelico_gta04-d5292c1647d3a711a05ac99ab2077698b3b4a8a0.tar.gz
bootable_bootloader_goldelico_gta04-d5292c1647d3a711a05ac99ab2077698b3b4a8a0.tar.bz2
USB-CDC: ethernet error path potential oops fix
Fix potential oops on rare error path. The patch is based on commit e7b13ec9235b9fded90f826ceeb8c34548631351 (done by David Brownell <david-b@pacbell.net>) from linux-2.6.git. Description of the issue taken from linux kernel bugzilla: (https://bugzilla.kernel.org/show_bug.cgi?id=9594) The potential error can be tracked down as follows: (1) line 807: let the second conjunct on the "if" statment be false meaning "dev->status_ep" is null. This means the "if" evaluates to false. follow thru the code until... (2) line 808: usb_ep_disable(dev->status_ep) passes in a null argument, however "usb_ep_disable" cannot handle that: (from include/linux/usb/gadget.h) 191 static inline int 192 usb_ep_disable (struct usb_ep *ep) 193 { 194 return ep->ops->disable (ep); 195 } -- Signed-off-by: Vitaly Kuzmichev <vkuzmichev@mvista.com>
Diffstat (limited to 'drivers/usb/gadget/ether.c')
-rw-r--r--drivers/usb/gadget/ether.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/drivers/usb/gadget/ether.c b/drivers/usb/gadget/ether.c
index 8126f76..c601d4a 100644
--- a/drivers/usb/gadget/ether.c
+++ b/drivers/usb/gadget/ether.c
@@ -801,7 +801,7 @@ done:
/* on error, disable any endpoints */
if (result < 0) {
- if (!subset_active(dev))
+ if (!subset_active(dev) && dev->status_ep)
(void) usb_ep_disable (dev->status_ep);
dev->status = NULL;
(void) usb_ep_disable (dev->in_ep);