Module Name: src
Committed By: riastradh
Date: Thu Mar 3 05:54:21 UTC 2022
Modified Files:
src/sys/dev/usb: if_aue.c if_axe.c if_axen.c if_mos.c if_mue.c
if_smsc.c if_udav.c if_ure.c if_url.c
Log Message:
usbnet drivers: Avoid undefined behaviour if read reg fails.
Some callers don't check the error code, e.g. ~all the mii phy
drivers using PHY_READ. Just return zero if the device is gone or
the xfer fails for any other reason.
To generate a diff of this commit:
cvs rdiff -u -r1.184 -r1.185 src/sys/dev/usb/if_aue.c
cvs rdiff -u -r1.143 -r1.144 src/sys/dev/usb/if_axe.c
cvs rdiff -u -r1.87 -r1.88 src/sys/dev/usb/if_axen.c
cvs rdiff -u -r1.16 -r1.17 src/sys/dev/usb/if_mos.c
cvs rdiff -u -r1.75 -r1.76 src/sys/dev/usb/if_mue.c
cvs rdiff -u -r1.85 -r1.86 src/sys/dev/usb/if_smsc.c
cvs rdiff -u -r1.90 -r1.91 src/sys/dev/usb/if_udav.c
cvs rdiff -u -r1.50 -r1.51 src/sys/dev/usb/if_ure.c
cvs rdiff -u -r1.89 -r1.90 src/sys/dev/usb/if_url.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_aue.c
diff -u src/sys/dev/usb/if_aue.c:1.184 src/sys/dev/usb/if_aue.c:1.185
--- src/sys/dev/usb/if_aue.c:1.184 Thu Mar 3 05:53:48 2022
+++ src/sys/dev/usb/if_aue.c Thu Mar 3 05:54:21 2022
@@ -1,4 +1,4 @@
-/* $NetBSD: if_aue.c,v 1.184 2022/03/03 05:53:48 riastradh Exp $ */
+/* $NetBSD: if_aue.c,v 1.185 2022/03/03 05:54:21 riastradh Exp $ */
/*
* Copyright (c) 1997, 1998, 1999, 2000
@@ -76,7 +76,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_aue.c,v 1.184 2022/03/03 05:53:48 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_aue.c,v 1.185 2022/03/03 05:54:21 riastradh Exp $");
#ifdef _KERNEL_OPT
#include "opt_usb.h"
@@ -466,8 +466,10 @@ aue_uno_mii_read_reg(struct usbnet *un,
*/
if (sc->aue_vendor == USB_VENDOR_ADMTEK &&
sc->aue_product == USB_PRODUCT_ADMTEK_PEGASUS) {
- if (phy == 3)
+ if (phy == 3) {
+ *val = 0;
return EINVAL;
+ }
}
#endif
@@ -475,8 +477,10 @@ aue_uno_mii_read_reg(struct usbnet *un,
aue_csr_write_1(sc, AUE_PHY_CTL, reg | AUE_PHYCTL_READ);
for (i = 0; i < AUE_TIMEOUT; i++) {
- if (usbnet_isdying(un))
+ if (usbnet_isdying(un)) {
+ *val = 0;
return ENXIO;
+ }
if (aue_csr_read_1(sc, AUE_PHY_CTL) & AUE_PHYCTL_DONE)
break;
}
@@ -484,6 +488,7 @@ aue_uno_mii_read_reg(struct usbnet *un,
if (i == AUE_TIMEOUT) {
AUEHIST_CALLARGS("aue%jd: phy=%#jx reg=%#jx read timed out",
device_unit(un->un_dev), phy, reg, 0);
+ *val = 0;
return ETIMEDOUT;
}
Index: src/sys/dev/usb/if_axe.c
diff -u src/sys/dev/usb/if_axe.c:1.143 src/sys/dev/usb/if_axe.c:1.144
--- src/sys/dev/usb/if_axe.c:1.143 Thu Mar 3 05:53:33 2022
+++ src/sys/dev/usb/if_axe.c Thu Mar 3 05:54:21 2022
@@ -1,4 +1,4 @@
-/* $NetBSD: if_axe.c,v 1.143 2022/03/03 05:53:33 riastradh Exp $ */
+/* $NetBSD: if_axe.c,v 1.144 2022/03/03 05:54:21 riastradh 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.143 2022/03/03 05:53:33 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_axe.c,v 1.144 2022/03/03 05:54:21 riastradh Exp $");
#ifdef _KERNEL_OPT
#include "opt_usb.h"
@@ -324,8 +324,10 @@ axe_uno_mii_read_reg(struct usbnet *un,
DPRINTFN(30, "phy %#jx reg %#jx\n", phy, reg, 0, 0);
- if (un->un_phyno != phy)
+ if (un->un_phyno != phy) {
+ *val = 0;
return EINVAL;
+ }
axe_cmd(sc, AXE_CMD_MII_OPMODE_SW, 0, 0, NULL);
@@ -334,6 +336,7 @@ axe_uno_mii_read_reg(struct usbnet *un,
if (err) {
device_printf(un->un_dev, "read PHY failed\n");
+ *val = 0;
return EIO;
}
Index: src/sys/dev/usb/if_axen.c
diff -u src/sys/dev/usb/if_axen.c:1.87 src/sys/dev/usb/if_axen.c:1.88
--- src/sys/dev/usb/if_axen.c:1.87 Thu Mar 3 05:54:11 2022
+++ src/sys/dev/usb/if_axen.c Thu Mar 3 05:54:21 2022
@@ -1,4 +1,4 @@
-/* $NetBSD: if_axen.c,v 1.87 2022/03/03 05:54:11 riastradh Exp $ */
+/* $NetBSD: if_axen.c,v 1.88 2022/03/03 05:54:21 riastradh Exp $ */
/* $OpenBSD: if_axen.c,v 1.3 2013/10/21 10:10:22 yuo Exp $ */
/*
@@ -23,7 +23,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_axen.c,v 1.87 2022/03/03 05:54:11 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_axen.c,v 1.88 2022/03/03 05:54:21 riastradh Exp $");
#ifdef _KERNEL_OPT
#include "opt_usb.h"
@@ -137,12 +137,16 @@ axen_uno_mii_read_reg(struct usbnet *un,
{
uint16_t data;
- if (un->un_phyno != phy)
+ if (un->un_phyno != phy) {
+ *val = 0;
return EINVAL;
+ }
usbd_status err = axen_cmd(un, AXEN_CMD_MII_READ_REG, reg, phy, &data);
- if (err)
+ if (err) {
+ *val = 0;
return EIO;
+ }
*val = le16toh(data);
if (reg == MII_BMSR)
Index: src/sys/dev/usb/if_mos.c
diff -u src/sys/dev/usb/if_mos.c:1.16 src/sys/dev/usb/if_mos.c:1.17
--- src/sys/dev/usb/if_mos.c:1.16 Thu Mar 3 05:53:33 2022
+++ src/sys/dev/usb/if_mos.c Thu Mar 3 05:54:21 2022
@@ -1,4 +1,4 @@
-/* $NetBSD: if_mos.c,v 1.16 2022/03/03 05:53:33 riastradh Exp $ */
+/* $NetBSD: if_mos.c,v 1.17 2022/03/03 05:54:21 riastradh Exp $ */
/* $OpenBSD: if_mos.c,v 1.40 2019/07/07 06:40:10 kevlo Exp $ */
/*
@@ -72,7 +72,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_mos.c,v 1.16 2022/03/03 05:53:33 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_mos.c,v 1.17 2022/03/03 05:54:21 riastradh Exp $");
#include <sys/param.h>
@@ -364,13 +364,16 @@ mos_uno_mii_read_reg(struct usbnet *un,
MOS_PHYSTS_PENDING);
for (i = 0; i < MOS_TIMEOUT; i++) {
- if (usbnet_isdying(un))
+ if (usbnet_isdying(un)) {
+ *val = 0;
return ENXIO;
+ }
if (mos_reg_read_1(un, MOS_PHY_STS) & MOS_PHYSTS_READY)
break;
}
if (i == MOS_TIMEOUT) {
aprint_error_dev(un->un_dev, "read PHY failed\n");
+ *val = 0;
return EIO;
}
Index: src/sys/dev/usb/if_mue.c
diff -u src/sys/dev/usb/if_mue.c:1.75 src/sys/dev/usb/if_mue.c:1.76
--- src/sys/dev/usb/if_mue.c:1.75 Thu Mar 3 05:54:03 2022
+++ src/sys/dev/usb/if_mue.c Thu Mar 3 05:54:21 2022
@@ -1,4 +1,4 @@
-/* $NetBSD: if_mue.c,v 1.75 2022/03/03 05:54:03 riastradh Exp $ */
+/* $NetBSD: if_mue.c,v 1.76 2022/03/03 05:54:21 riastradh Exp $ */
/* $OpenBSD: if_mue.c,v 1.3 2018/08/04 16:42:46 jsg Exp $ */
/*
@@ -20,7 +20,7 @@
/* Driver for Microchip LAN7500/LAN7800 chipsets. */
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_mue.c,v 1.75 2022/03/03 05:54:03 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_mue.c,v 1.76 2022/03/03 05:54:21 riastradh Exp $");
#ifdef _KERNEL_OPT
#include "opt_usb.h"
@@ -219,11 +219,14 @@ mue_uno_mii_read_reg(struct usbnet *un,
{
uint32_t data;
- if (un->un_phyno != phy)
+ if (un->un_phyno != phy) {
+ *val = 0;
return EINVAL;
+ }
if (MUE_WAIT_CLR(un, MUE_MII_ACCESS, MUE_MII_ACCESS_BUSY, 0)) {
MUE_PRINTF(un, "not ready\n");
+ *val = 0;
return EBUSY;
}
@@ -233,6 +236,7 @@ mue_uno_mii_read_reg(struct usbnet *un,
if (MUE_WAIT_CLR(un, MUE_MII_ACCESS, MUE_MII_ACCESS_BUSY, 0)) {
MUE_PRINTF(un, "timed out\n");
+ *val = 0;
return ETIMEDOUT;
}
Index: src/sys/dev/usb/if_smsc.c
diff -u src/sys/dev/usb/if_smsc.c:1.85 src/sys/dev/usb/if_smsc.c:1.86
--- src/sys/dev/usb/if_smsc.c:1.85 Thu Mar 3 05:54:03 2022
+++ src/sys/dev/usb/if_smsc.c Thu Mar 3 05:54:21 2022
@@ -1,4 +1,4 @@
-/* $NetBSD: if_smsc.c,v 1.85 2022/03/03 05:54:03 riastradh Exp $ */
+/* $NetBSD: if_smsc.c,v 1.86 2022/03/03 05:54:21 riastradh 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.85 2022/03/03 05:54:03 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_smsc.c,v 1.86 2022/03/03 05:54:21 riastradh Exp $");
#ifdef _KERNEL_OPT
#include "opt_usb.h"
@@ -279,11 +279,14 @@ smsc_uno_miibus_readreg(struct usbnet *u
uint32_t addr;
uint32_t data = 0;
- if (un->un_phyno != phy)
+ if (un->un_phyno != phy) {
+ *val = 0;
return EINVAL;
+ }
if (smsc_wait_for_bits(un, SMSC_MII_ADDR, SMSC_MII_BUSY) != 0) {
smsc_warn_printf(un, "MII is busy\n");
+ *val = 0;
return ETIMEDOUT;
}
@@ -292,6 +295,7 @@ smsc_uno_miibus_readreg(struct usbnet *u
if (smsc_wait_for_bits(un, SMSC_MII_ADDR, SMSC_MII_BUSY) != 0) {
smsc_warn_printf(un, "MII read timeout\n");
+ *val = 0;
return ETIMEDOUT;
}
Index: src/sys/dev/usb/if_udav.c
diff -u src/sys/dev/usb/if_udav.c:1.90 src/sys/dev/usb/if_udav.c:1.91
--- src/sys/dev/usb/if_udav.c:1.90 Thu Mar 3 05:53:56 2022
+++ src/sys/dev/usb/if_udav.c Thu Mar 3 05:54:21 2022
@@ -1,4 +1,4 @@
-/* $NetBSD: if_udav.c,v 1.90 2022/03/03 05:53:56 riastradh Exp $ */
+/* $NetBSD: if_udav.c,v 1.91 2022/03/03 05:54:21 riastradh Exp $ */
/* $nabe: if_udav.c,v 1.3 2003/08/21 16:57:19 nabe Exp $ */
/*
@@ -45,7 +45,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_udav.c,v 1.90 2022/03/03 05:53:56 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_udav.c,v 1.91 2022/03/03 05:54:21 riastradh Exp $");
#ifdef _KERNEL_OPT
#include "opt_usb.h"
@@ -383,6 +383,7 @@ udav_csr_read(struct usbnet *un, int off
if (err) {
DPRINTF(("%s: %s: read failed. off=%04x, err=%d\n",
device_xname(un->un_dev), __func__, offset, err));
+ memset(buf, 0, len);
}
return err;
@@ -731,6 +732,7 @@ udav_uno_mii_read_reg(struct usbnet *un,
printf("%s: %s: dying\n", device_xname(un->un_dev),
__func__);
#endif
+ *val = 0;
return EINVAL;
}
@@ -738,6 +740,7 @@ udav_uno_mii_read_reg(struct usbnet *un,
if (phy != 0) {
DPRINTFN(0xff, ("%s: %s: phy=%d is not supported\n",
device_xname(un->un_dev), __func__, phy));
+ *val = 0;
return EINVAL;
}
Index: src/sys/dev/usb/if_ure.c
diff -u src/sys/dev/usb/if_ure.c:1.50 src/sys/dev/usb/if_ure.c:1.51
--- src/sys/dev/usb/if_ure.c:1.50 Thu Mar 3 05:53:33 2022
+++ src/sys/dev/usb/if_ure.c Thu Mar 3 05:54:21 2022
@@ -1,4 +1,4 @@
-/* $NetBSD: if_ure.c,v 1.50 2022/03/03 05:53:33 riastradh Exp $ */
+/* $NetBSD: if_ure.c,v 1.51 2022/03/03 05:54:21 riastradh 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.50 2022/03/03 05:53:33 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_ure.c,v 1.51 2022/03/03 05:54:21 riastradh Exp $");
#ifdef _KERNEL_OPT
#include "opt_usb.h"
@@ -137,6 +137,8 @@ ure_ctl(struct usbnet *un, uint8_t rw, u
err = usbd_do_request(un->un_udev, &req, buf);
if (err) {
DPRINTF(("ure_ctl: error %d\n", err));
+ if (rw == URE_CTL_READ)
+ memset(buf, 0, len);
return -1;
}
@@ -277,8 +279,10 @@ static int
ure_uno_mii_read_reg(struct usbnet *un, int phy, int reg, uint16_t *val)
{
- if (un->un_phyno != phy)
+ if (un->un_phyno != phy) {
+ *val = 0;
return EINVAL;
+ }
/* Let the rgephy driver read the URE_PLA_PHYSTATUS register. */
if (reg == RTK_GMEDIASTAT) {
Index: src/sys/dev/usb/if_url.c
diff -u src/sys/dev/usb/if_url.c:1.89 src/sys/dev/usb/if_url.c:1.90
--- src/sys/dev/usb/if_url.c:1.89 Thu Mar 3 05:53:33 2022
+++ src/sys/dev/usb/if_url.c Thu Mar 3 05:54:21 2022
@@ -1,4 +1,4 @@
-/* $NetBSD: if_url.c,v 1.89 2022/03/03 05:53:33 riastradh Exp $ */
+/* $NetBSD: if_url.c,v 1.90 2022/03/03 05:54:21 riastradh Exp $ */
/*
* Copyright (c) 2001, 2002
@@ -44,7 +44,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_url.c,v 1.89 2022/03/03 05:53:33 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_url.c,v 1.90 2022/03/03 05:54:21 riastradh Exp $");
#ifdef _KERNEL_OPT
#include "opt_inet.h"
@@ -271,8 +271,11 @@ url_mem(struct usbnet *un, int cmd, int
DPRINTFN(0x200,
("%s: %s: enter\n", device_xname(un->un_dev), __func__));
- if (usbnet_isdying(un))
+ if (usbnet_isdying(un)) {
+ if (cmd == URL_CMD_READMEM)
+ memset(buf, 0, len);
return 0;
+ }
if (cmd == URL_CMD_READMEM)
req.bmRequestType = UT_READ_VENDOR_DEVICE;
@@ -289,6 +292,8 @@ url_mem(struct usbnet *un, int cmd, int
device_xname(un->un_dev),
cmd == URL_CMD_READMEM ? "read" : "write",
offset, err));
+ if (cmd == URL_CMD_READMEM)
+ memset(buf, 0, len);
}
return err;
@@ -561,6 +566,7 @@ url_uno_mii_read_reg(struct usbnet *un,
if (phy != 0) {
DPRINTFN(0xff, ("%s: %s: phy=%d is not supported\n",
device_xname(un->un_dev), __func__, phy));
+ *val = 0;
return EINVAL;
}