Module Name:    src
Committed By:   maxv
Date:           Sat Sep 14 12:53:24 UTC 2019

Modified Files:
        src/sys/dev/usb: if_upgt.c if_upgtvar.h

Log Message:
Fix error handling, to prevent kernel crashes when detaching an upgt0
device.

Found with vHCI.


To generate a diff of this commit:
cvs rdiff -u -r1.25 -r1.26 src/sys/dev/usb/if_upgt.c
cvs rdiff -u -r1.2 -r1.3 src/sys/dev/usb/if_upgtvar.h

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/if_upgt.c
diff -u src/sys/dev/usb/if_upgt.c:1.25 src/sys/dev/usb/if_upgt.c:1.26
--- src/sys/dev/usb/if_upgt.c:1.25	Wed Mar  6 08:08:25 2019
+++ src/sys/dev/usb/if_upgt.c	Sat Sep 14 12:53:24 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_upgt.c,v 1.25 2019/03/06 08:08:25 msaitoh Exp $	*/
+/*	$NetBSD: if_upgt.c,v 1.26 2019/09/14 12:53:24 maxv Exp $	*/
 /*	$OpenBSD: if_upgt.c,v 1.49 2010/04/20 22:05:43 tedu Exp $ */
 
 /*
@@ -18,7 +18,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_upgt.c,v 1.25 2019/03/06 08:08:25 msaitoh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_upgt.c,v 1.26 2019/09/14 12:53:24 maxv Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_usb.h"
@@ -239,6 +239,7 @@ upgt_attach(device_t parent, device_t se
 	 */
 	sc->sc_dev = self;
 	sc->sc_udev = uaa->uaa_device;
+	sc->sc_init_state = UPGT_INIT_NONE;
 
 	devinfop = usbd_devinfo_alloc(sc->sc_udev, 0);
 	aprint_normal_dev(sc->sc_dev, "%s\n", devinfop);
@@ -306,6 +307,7 @@ upgt_attach(device_t parent, device_t se
 	callout_setfunc(&sc->scan_to, upgt_next_scan, sc);
 	callout_init(&sc->led_to, 0);
 	callout_setfunc(&sc->led_to, upgt_set_led_blink, sc);
+	sc->sc_init_state = UPGT_INIT_INITED;
 
 	/*
 	 * Open TX and RX USB bulk pipes.
@@ -498,6 +500,9 @@ upgt_detach(device_t self, int flags)
 
 	DPRINTF(1, "%s: %s\n", device_xname(sc->sc_dev), __func__);
 
+	if (sc->sc_init_state < UPGT_INIT_INITED)
+		return 0;
+
 	s = splnet();
 
 	if (ifp->if_flags & IFF_RUNNING)

Index: src/sys/dev/usb/if_upgtvar.h
diff -u src/sys/dev/usb/if_upgtvar.h:1.2 src/sys/dev/usb/if_upgtvar.h:1.3
--- src/sys/dev/usb/if_upgtvar.h:1.2	Sat Apr 23 10:15:31 2016
+++ src/sys/dev/usb/if_upgtvar.h	Sat Sep 14 12:53:24 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_upgtvar.h,v 1.2 2016/04/23 10:15:31 skrll Exp $	*/
+/*	$NetBSD: if_upgtvar.h,v 1.3 2019/09/14 12:53:24 maxv Exp $	*/
 /*	$OpenBSD: if_upgtvar.h,v 1.15 2009/08/10 20:02:19 deraadt Exp $ */
 
 /*
@@ -398,6 +398,10 @@ struct upgt_softc {
 	struct ethercom		 sc_ec;
 #define sc_if	sc_ec.ec_if
 
+	enum {
+		UPGT_INIT_NONE,
+		UPGT_INIT_INITED
+	} sc_init_state;
 	struct usbd_device *	 sc_udev;
 	struct usbd_interface *	 sc_iface;
 	int			 sc_rx_no;

Reply via email to