Module Name: src
Committed By: maxv
Date: Sat Sep 14 12:40:31 UTC 2019
Modified Files:
src/sys/dev/usb: if_urtw.c if_urtwreg.h
Log Message:
Fix error handling, to prevent kernel crashes when detaching an urtw0
device. Also, fail safely if we didn't recognize the RF chip, to prevent
kernel crashes at attach time. Note that other panics are there, maybe
they also should be removed.
Found with vHCI.
To generate a diff of this commit:
cvs rdiff -u -r1.18 -r1.19 src/sys/dev/usb/if_urtw.c
cvs rdiff -u -r1.2 -r1.3 src/sys/dev/usb/if_urtwreg.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_urtw.c
diff -u src/sys/dev/usb/if_urtw.c:1.18 src/sys/dev/usb/if_urtw.c:1.19
--- src/sys/dev/usb/if_urtw.c:1.18 Wed Sep 12 21:57:18 2018
+++ src/sys/dev/usb/if_urtw.c Sat Sep 14 12:40:31 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: if_urtw.c,v 1.18 2018/09/12 21:57:18 christos Exp $ */
+/* $NetBSD: if_urtw.c,v 1.19 2019/09/14 12:40:31 maxv Exp $ */
/* $OpenBSD: if_urtw.c,v 1.39 2011/07/03 15:47:17 matthew Exp $ */
/*-
@@ -19,7 +19,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_urtw.c,v 1.18 2018/09/12 21:57:18 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_urtw.c,v 1.19 2019/09/14 12:40:31 maxv Exp $");
#ifdef _KERNEL_OPT
#include "opt_usb.h"
@@ -614,6 +614,7 @@ urtw_attach(device_t parent, device_t se
sc->sc_dev = self;
sc->sc_udev = uaa->uaa_device;
sc->sc_hwrev = urtw_lookup(uaa->uaa_vendor, uaa->uaa_product)->rev;
+ sc->sc_init_state = URTW_INIT_NONE;
aprint_naive("\n");
aprint_normal(": ");
@@ -757,6 +758,8 @@ urtw_attach(device_t parent, device_t se
ieee80211_announce(ic);
+ sc->sc_init_state = URTW_INIT_INITED;
+
return;
fail:
aprint_error(": %s failed!\n", __func__);
@@ -774,6 +777,9 @@ urtw_detach(device_t self, int flags)
sc->sc_dying = true;
+ if (sc->sc_init_state < URTW_INIT_INITED)
+ goto out;
+
callout_halt(&sc->scan_to, NULL);
callout_halt(&sc->sc_led_ch, NULL);
callout_destroy(&sc->scan_to);
@@ -794,8 +800,8 @@ urtw_detach(device_t self, int flags)
urtw_free_rx_data_list(sc);
urtw_close_pipes(sc);
+out:
splx(s);
-
return 0;
}
@@ -1279,8 +1285,7 @@ urtw_get_rfchip(struct urtw_softc *sc)
if (sc->sc_hwrev & URTW_HWREV_8187) {
error = urtw_eprom_read32(sc, URTW_EPROM_RFCHIPID, &data);
if (error != 0)
- panic("unsupported RF chip");
- /* NOTREACHED */
+ return error;
switch (data & 0xff) {
case URTW_EPROM_RFCHIPID_RTL8225U:
error = urtw_8225_isv2(sc, &ret);
@@ -1313,8 +1318,8 @@ urtw_get_rfchip(struct urtw_softc *sc)
return 0;
fail:
- panic("unsupported RF chip %d", data & 0xff);
- /* NOTREACHED */
+ aprint_error(": unsupported RF chip %d", data & 0xff);
+ return USBD_INVAL;
}
usbd_status
Index: src/sys/dev/usb/if_urtwreg.h
diff -u src/sys/dev/usb/if_urtwreg.h:1.2 src/sys/dev/usb/if_urtwreg.h:1.3
--- src/sys/dev/usb/if_urtwreg.h:1.2 Sat Apr 23 10:15:32 2016
+++ src/sys/dev/usb/if_urtwreg.h Sat Sep 14 12:40:31 2019
@@ -323,6 +323,11 @@ struct urtw_softc {
struct ieee80211com sc_ic;
struct ethercom sc_ec;
#define sc_if sc_ec.ec_if
+
+ enum {
+ URTW_INIT_NONE,
+ URTW_INIT_INITED
+ } sc_init_state;
int (*sc_newstate)(struct ieee80211com *,
enum ieee80211_state, int);
struct urtw_rf sc_rf;