diff options
| author | riastradh <riastradh@NetBSD.org> | 2022-03-03 05:47:06 +0000 |
|---|---|---|
| committer | riastradh <riastradh@NetBSD.org> | 2022-03-03 05:47:06 +0000 |
| commit | 2d5a6724d019aaefb0780da17788d036e57904b3 (patch) | |
| tree | 3292a090e51a0160367fec307ccd4a1068c0f351 /sys/dev/usb | |
| parent | 0c57e692542262d66289cc23f87c3bb19b0ab547 (diff) | |
usbnet: Take IFNET_LOCK around access to if_flags in usbnet_detach.
This is not stable without IFNET_LOCK. Extraneous calls to
usbnet_stop arising from this race might be harmless, but let's
render it unnecessary to even think about that.
Diffstat (limited to 'sys/dev/usb')
| -rw-r--r-- | sys/dev/usb/usbnet.c | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/sys/dev/usb/usbnet.c b/sys/dev/usb/usbnet.c index 767d4268c57..99fc4c24aea 100644 --- a/sys/dev/usb/usbnet.c +++ b/sys/dev/usb/usbnet.c @@ -1,4 +1,4 @@ -/* $NetBSD: usbnet.c,v 1.46 2022/03/03 05:46:58 riastradh Exp $ */ +/* $NetBSD: usbnet.c,v 1.47 2022/03/03 05:47:06 riastradh Exp $ */ /* * Copyright (c) 2019 Matthew R. Green @@ -31,7 +31,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: usbnet.c,v 1.46 2022/03/03 05:46:58 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: usbnet.c,v 1.47 2022/03/03 05:47:06 riastradh Exp $"); #include <sys/param.h> #include <sys/kernel.h> @@ -1554,11 +1554,11 @@ usbnet_detach(device_t self, int flags) unp->unp_dying = true; mutex_exit(&unp->unp_core_lock); + IFNET_LOCK(ifp); if (ifp->if_flags & IFF_RUNNING) { - IFNET_LOCK(ifp); usbnet_if_stop(ifp, 1); - IFNET_UNLOCK(ifp); } + IFNET_UNLOCK(ifp); callout_halt(&unp->unp_stat_ch, NULL); usb_rem_task_wait(un->un_udev, &unp->unp_ticktask, USB_TASKQ_DRIVER, |
