Module Name: src Committed By: mrg Date: Sun Aug 11 23:55:43 UTC 2019
Modified Files: src/sys/dev/usb: if_axe.c if_smsc.c if_ure.c if_urndis.c usbnet.c Log Message: don't set dv_private. it's a bad pattern and only didn't trip kmem_free() lossage because struct usbnet is at the start of the softc. for now, enforce this as part of the ABI. catch up urndis with tx_prepare checking buffer length, and also add an assert to usbnet_start_locked() to match. To generate a diff of this commit: cvs rdiff -u -r1.112 -r1.113 src/sys/dev/usb/if_axe.c cvs rdiff -u -r1.55 -r1.56 src/sys/dev/usb/if_smsc.c cvs rdiff -u -r1.24 -r1.25 src/sys/dev/usb/if_ure.c cvs rdiff -u -r1.28 -r1.29 src/sys/dev/usb/if_urndis.c cvs rdiff -u -r1.12 -r1.13 src/sys/dev/usb/usbnet.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/if_axe.c diff -u src/sys/dev/usb/if_axe.c:1.112 src/sys/dev/usb/if_axe.c:1.113 --- src/sys/dev/usb/if_axe.c:1.112 Sun Aug 11 05:14:41 2019 +++ src/sys/dev/usb/if_axe.c Sun Aug 11 23:55:43 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: if_axe.c,v 1.112 2019/08/11 05:14:41 mrg Exp $ */ +/* $NetBSD: if_axe.c,v 1.113 2019/08/11 23:55:43 mrg Exp $ */ /* $OpenBSD: if_axe.c,v 1.137 2016/04/13 11:03:37 mpi Exp $ */ /* @@ -87,7 +87,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_axe.c,v 1.112 2019/08/11 05:14:41 mrg Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_axe.c,v 1.113 2019/08/11 23:55:43 mrg Exp $"); #ifdef _KERNEL_OPT #include "opt_usb.h" @@ -873,8 +873,7 @@ axe_attach(device_t parent, device_t sel unsigned bufsz; int i; - /* Switch to usbnet for device_private() */ - self->dv_private = un; + KASSERT((void *)sc == un); aprint_naive("\n"); aprint_normal("\n"); Index: src/sys/dev/usb/if_smsc.c diff -u src/sys/dev/usb/if_smsc.c:1.55 src/sys/dev/usb/if_smsc.c:1.56 --- src/sys/dev/usb/if_smsc.c:1.55 Sun Aug 11 12:16:59 2019 +++ src/sys/dev/usb/if_smsc.c Sun Aug 11 23:55:43 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: if_smsc.c,v 1.55 2019/08/11 12:16:59 skrll Exp $ */ +/* $NetBSD: if_smsc.c,v 1.56 2019/08/11 23:55:43 mrg Exp $ */ /* $OpenBSD: if_smsc.c,v 1.4 2012/09/27 12:38:11 jsg Exp $ */ /* $FreeBSD: src/sys/dev/usb/net/if_smsc.c,v 1.1 2012/08/15 04:03:55 gonzo Exp $ */ @@ -61,7 +61,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_smsc.c,v 1.55 2019/08/11 12:16:59 skrll Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_smsc.c,v 1.56 2019/08/11 23:55:43 mrg Exp $"); #ifdef _KERNEL_OPT #include "opt_usb.h" @@ -823,8 +823,7 @@ smsc_attach(device_t parent, device_t se int err, i; uint32_t mac_h, mac_l; - /* Switch to usbnet for device_private() */ - self->dv_private = un; + KASSERT((void *)sc == un); aprint_naive("\n"); aprint_normal("\n"); Index: src/sys/dev/usb/if_ure.c diff -u src/sys/dev/usb/if_ure.c:1.24 src/sys/dev/usb/if_ure.c:1.25 --- src/sys/dev/usb/if_ure.c:1.24 Sun Aug 11 08:57:36 2019 +++ src/sys/dev/usb/if_ure.c Sun Aug 11 23:55:43 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: if_ure.c,v 1.24 2019/08/11 08:57:36 skrll Exp $ */ +/* $NetBSD: if_ure.c,v 1.25 2019/08/11 23:55:43 mrg Exp $ */ /* $OpenBSD: if_ure.c,v 1.10 2018/11/02 21:32:30 jcs Exp $ */ /*- @@ -30,7 +30,7 @@ /* RealTek RTL8152/RTL8153 10/100/Gigabit USB Ethernet device */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_ure.c,v 1.24 2019/08/11 08:57:36 skrll Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_ure.c,v 1.25 2019/08/11 23:55:43 mrg Exp $"); #ifdef _KERNEL_OPT #include "opt_usb.h" @@ -842,9 +842,6 @@ ure_attach(device_t parent, device_t sel uint8_t eaddr[8]; /* 2byte padded */ char *devinfop; - /* Switch to usbnet for device_private() */ - self->dv_private = un; - aprint_naive("\n"); aprint_normal("\n"); devinfop = usbd_devinfo_alloc(dev, 0); Index: src/sys/dev/usb/if_urndis.c diff -u src/sys/dev/usb/if_urndis.c:1.28 src/sys/dev/usb/if_urndis.c:1.29 --- src/sys/dev/usb/if_urndis.c:1.28 Sun Aug 11 13:16:10 2019 +++ src/sys/dev/usb/if_urndis.c Sun Aug 11 23:55:43 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: if_urndis.c,v 1.28 2019/08/11 13:16:10 hannken Exp $ */ +/* $NetBSD: if_urndis.c,v 1.29 2019/08/11 23:55:43 mrg Exp $ */ /* $OpenBSD: if_urndis.c,v 1.31 2011/07/03 15:47:17 matthew Exp $ */ /* @@ -21,7 +21,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_urndis.c,v 1.28 2019/08/11 13:16:10 hannken Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_urndis.c,v 1.29 2019/08/11 23:55:43 mrg Exp $"); #ifdef _KERNEL_OPT #include "opt_usb.h" @@ -720,6 +720,11 @@ urndis_tx_prepare(struct usbnet *un, str { struct rndis_packet_msg *msg; + usbnet_isowned_tx(un); + + if (m->m_pkthdr.len > un->un_tx_bufsz - sizeof(*msg)) + return 0; + msg = (struct rndis_packet_msg *)c->unc_buf; memset(msg, 0, sizeof(*msg)); @@ -929,8 +934,7 @@ urndis_attach(device_t parent, device_t uint32_t filter; char *devinfop; - /* Switch to usbnet for device_private() */ - self->dv_private = un; + KASSERT((void *)sc == un); aprint_naive("\n"); aprint_normal("\n"); Index: src/sys/dev/usb/usbnet.c diff -u src/sys/dev/usb/usbnet.c:1.12 src/sys/dev/usb/usbnet.c:1.13 --- src/sys/dev/usb/usbnet.c:1.12 Sun Aug 11 01:31:19 2019 +++ src/sys/dev/usb/usbnet.c Sun Aug 11 23:55:43 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: usbnet.c,v 1.12 2019/08/11 01:31:19 mrg Exp $ */ +/* $NetBSD: usbnet.c,v 1.13 2019/08/11 23:55:43 mrg Exp $ */ /* * Copyright (c) 2019 Matthew R. Green @@ -29,11 +29,11 @@ */ /* - * Common code shared between USB ethernet drivers. + * Common code shared between USB network drivers. */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: usbnet.c,v 1.12 2019/08/11 01:31:19 mrg Exp $"); +__KERNEL_RCSID(0, "$NetBSD: usbnet.c,v 1.13 2019/08/11 23:55:43 mrg Exp $"); #include <sys/param.h> #include <sys/kernel.h> @@ -438,6 +438,7 @@ usbnet_start_locked(struct ifnet *ifp) IFQ_POLL(&ifp->if_snd, m); if (m == NULL) break; + KASSERT(m->m_pkthdr.len <= un->un_tx_bufsz); struct usbnet_chain *c = &cd->uncd_tx_chain[idx]; @@ -1274,6 +1275,9 @@ usbnet_attach(struct usbnet *un, KASSERT(un->un_rx_list_cnt); KASSERT(un->un_tx_list_cnt); + /* Unfortunate fact. */ + KASSERT(un == device_private(un->un_dev)); + un->un_pri = kmem_zalloc(sizeof(*un->un_pri), KM_SLEEP); struct usbnet_private * const unp = un->un_pri;