From: Eugenia Emantayev <euge...@mellanox.com> Check presence of network device before calling device driver ndo_get_phys_port_name callback. Otherwise callback may access non-existing data structures and cause kernel panic.
Fixes: db24a9044ee1 ('net: add support for phys_port_name') Signed-off-by: Eugenia Emantayev <euge...@mellanox.com> Signed-off-by: Tariq Toukan <tar...@mellanox.com> Reported-by: Sebastian Ott <seb...@linux.vnet.ibm.com> Reported-by: Steve Wise <sw...@opengridcomputing.com> Cc: Jiri Pirko <j...@mellanox.com> --- net/core/dev.c | 2 ++ net/core/rtnetlink.c | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/net/core/dev.c b/net/core/dev.c index 7de0d000a9f8..b21d77405863 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -6623,6 +6623,8 @@ int dev_get_phys_port_name(struct net_device *dev, if (!ops->ndo_get_phys_port_name) return -EOPNOTSUPP; + if (!netif_device_present(dev)) + return -ENODEV; return ops->ndo_get_phys_port_name(dev, name, len); } EXPORT_SYMBOL(dev_get_phys_port_name); diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c index b3dd81f82e70..40cd41376566 100644 --- a/net/core/rtnetlink.c +++ b/net/core/rtnetlink.c @@ -1054,7 +1054,7 @@ static int rtnl_phys_port_name_fill(struct sk_buff *skb, struct net_device *dev) err = dev_get_phys_port_name(dev, name, sizeof(name)); if (err) { - if (err == -EOPNOTSUPP) + if (err == -EOPNOTSUPP || err == -ENODEV) return 0; return err; } -- 1.8.3.1