Module Name:    src
Committed By:   skrll
Date:           Thu Apr  4 13:28:57 UTC 2013

Modified Files:
        src/sys/dev/usb: ohci.c

Log Message:
Handle errors in ohci_open better.


To generate a diff of this commit:
cvs rdiff -u -r1.240 -r1.241 src/sys/dev/usb/ohci.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/dev/usb/ohci.c
diff -u src/sys/dev/usb/ohci.c:1.240 src/sys/dev/usb/ohci.c:1.241
--- src/sys/dev/usb/ohci.c:1.240	Thu Apr  4 13:27:55 2013
+++ src/sys/dev/usb/ohci.c	Thu Apr  4 13:28:57 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: ohci.c,v 1.240 2013/04/04 13:27:55 skrll Exp $	*/
+/*	$NetBSD: ohci.c,v 1.241 2013/04/04 13:28:57 skrll Exp $	*/
 
 /*
  * Copyright (c) 1998, 2004, 2005, 2012 The NetBSD Foundation, Inc.
@@ -41,7 +41,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ohci.c,v 1.240 2013/04/04 13:27:55 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ohci.c,v 1.241 2013/04/04 13:28:57 skrll Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -2136,8 +2136,7 @@ ohci_open(usbd_pipe_handle pipe)
 		     pipe, addr, ed->bEndpointAddress, sc->sc_addr));
 
 	if (sc->sc_dying) {
-		err = USBD_IOERROR;
-		goto bad0;
+		return USBD_IOERROR;
 	}
 
 	std = NULL;
@@ -2153,19 +2152,20 @@ ohci_open(usbd_pipe_handle pipe)
 			break;
 		default:
 			err = USBD_INVAL;
-			goto bad0;
+			goto bad;
 		}
 	} else {
 		sed = ohci_alloc_sed(sc);
 		if (sed == NULL)
-			goto bad0;
+			goto bad;
 		opipe->sed = sed;
 		if (xfertype == UE_ISOCHRONOUS) {
 			mutex_enter(&sc->sc_lock);
 			sitd = ohci_alloc_sitd(sc);
 			mutex_exit(&sc->sc_lock);
 			if (sitd == NULL)
-				goto bad1;
+				goto bad;
+
 			opipe->tail.itd = sitd;
 			tdphys = sitd->physaddr;
 			fmt = OHCI_ED_FORMAT_ISO;
@@ -2178,7 +2178,8 @@ ohci_open(usbd_pipe_handle pipe)
 			std = ohci_alloc_std(sc);
 			mutex_exit(&sc->sc_lock);
 			if (std == NULL)
-				goto bad1;
+				goto bad;
+
 			opipe->tail.td = std;
 			tdphys = std->physaddr;
 			fmt = OHCI_ED_FORMAT_GEN | OHCI_ED_DIR_TD;
@@ -2231,12 +2232,13 @@ ohci_open(usbd_pipe_handle pipe)
 	return USBD_NORMAL_COMPLETION;
 
  bad:
-	if (std != NULL)
+	if (std != NULL) {
+		mutex_enter(&sc->sc_lock);
 		ohci_free_std(sc, std);
- bad1:
+		mutex_exit(&sc->sc_lock);
+	}
 	if (sed != NULL)
 		ohci_free_sed(sc, sed);
- bad0:
 	return err;
 
 }

Reply via email to