[U-Boot] [PATCH 2/3] net, phy: fix NULL pointer deference
Heiko Schocher
hs at denx.de
Thu Sep 5 08:05:32 CEST 2013
if phydev is a NULL pointer, code crash, so add check if phydev != NULL
Signed-off-by: Heiko Schocher <hs at denx.de>
Cc: Andy Fleming <afleming at freescale.com>
Cc: Kumar Gala <galak at kernel.crashing.org>
Cc: Joe Hershberger <joe.hershberger at gmail.com>
Cc: Tom Rini <trini at ti.com>
---
Found on the dxr2 board with no phy connected to the board,
U-Boot crashes with:
U-Boot# tftp 0x80200000 /tftpboot/dxr2/u-boot.bin
data abort
MAYBE you should read doc/README.arm-unaligned-accesses
pc : [<87f80ffc>] lr : [<87f7fbdc>]
sp : 86f5ace0 ip : ffffff00 fp : 87f9a2c2
r10: 00000000 r9 : 87f9a2c7 r8 : 86f5af30
r7 : 00000000 r6 : 86f5f750 r5 : 86f5f7f0 r4 : 86f5f750
r3 : 86f5f804 r2 : 86f5f7f0 r1 : 00000014 r0 : 00000000
Flags: Nzcv IRQs off FIQs on Mode SVC_32
Resetting CPU ...
resetting ...
---
drivers/net/phy/phy.c | 30 ++++++++++++++++++++++++++++++
1 Datei geändert, 30 Zeilen hinzugefügt(+)
diff --git a/drivers/net/phy/phy.c b/drivers/net/phy/phy.c
index 62925bb..4885100 100644
--- a/drivers/net/phy/phy.c
+++ b/drivers/net/phy/phy.c
@@ -36,6 +36,9 @@ static int genphy_config_advert(struct phy_device *phydev)
int oldadv, adv;
int err, changed = 0;
+ if (!phydev)
+ return -1;
+
/* Only allow advertising what
* this PHY supports */
phydev->advertising &= phydev->supported;
@@ -114,6 +117,9 @@ static int genphy_setup_forced(struct phy_device *phydev)
int err;
int ctl = 0;
+ if (!phydev)
+ return -1;
+
phydev->pause = phydev->asym_pause = 0;
if (SPEED_1000 == phydev->speed)
@@ -166,6 +172,9 @@ int genphy_config_aneg(struct phy_device *phydev)
{
int result;
+ if (!phydev)
+ return -1;
+
if (AUTONEG_ENABLE != phydev->autoneg)
return genphy_setup_forced(phydev);
@@ -206,6 +215,9 @@ int genphy_update_link(struct phy_device *phydev)
{
unsigned int mii_reg;
+ if (!phydev)
+ return -1;
+
/*
* Wait if the link is up, and autonegotiation is in progress
* (ie - we're capable and it's not done)
@@ -274,6 +286,9 @@ int genphy_parse_link(struct phy_device *phydev)
{
int mii_reg = phy_read(phydev, MDIO_DEVAD_NONE, MII_BMSR);
+ if (!phydev)
+ return -1;
+
/* We're using autonegotiation */
if (mii_reg & BMSR_ANEGCAPABLE) {
u32 lpa = 0;
@@ -365,6 +380,9 @@ int genphy_config(struct phy_device *phydev)
int val;
u32 features;
+ if (!phydev)
+ return -1;
+
/* For now, I'll claim that the generic driver supports
* all possible port types */
features = (SUPPORTED_TP | SUPPORTED_MII
@@ -495,6 +513,9 @@ static int phy_probe(struct phy_device *phydev)
{
int err = 0;
+ if (!phydev)
+ return -1;
+
phydev->advertising = phydev->supported = phydev->drv->features;
phydev->mmds = phydev->drv->mmds;
@@ -782,6 +803,9 @@ struct phy_device *phy_connect(struct mii_dev *bus, int addr,
*/
int phy_startup(struct phy_device *phydev)
{
+ if (!phydev)
+ return -1;
+
if (phydev->drv->startup)
return phydev->drv->startup(phydev);
@@ -790,6 +814,9 @@ int phy_startup(struct phy_device *phydev)
static int __board_phy_config(struct phy_device *phydev)
{
+ if (!phydev)
+ return -1;
+
if (phydev->drv->config)
return phydev->drv->config(phydev);
return 0;
@@ -808,6 +835,9 @@ int phy_config(struct phy_device *phydev)
int phy_shutdown(struct phy_device *phydev)
{
+ if (!phydev)
+ return -1;
+
if (phydev->drv->shutdown)
phydev->drv->shutdown(phydev);
--
1.7.11.7
More information about the U-Boot
mailing list