linux-stable/drivers/net/dsa
Chen Zhongjin 4d2024b138 net: dsa: Fix possible memory leaks in dsa_loop_init()
[ Upstream commit 633efc8b3d ]

kmemleak reported memory leaks in dsa_loop_init():

kmemleak: 12 new suspected memory leaks

unreferenced object 0xffff8880138ce000 (size 2048):
  comm "modprobe", pid 390, jiffies 4295040478 (age 238.976s)
  backtrace:
    [<000000006a94f1d5>] kmalloc_trace+0x26/0x60
    [<00000000a9c44622>] phy_device_create+0x5d/0x970
    [<00000000d0ee2afc>] get_phy_device+0xf3/0x2b0
    [<00000000dca0c71f>] __fixed_phy_register.part.0+0x92/0x4e0
    [<000000008a834798>] fixed_phy_register+0x84/0xb0
    [<0000000055223fcb>] dsa_loop_init+0xa9/0x116 [dsa_loop]
    ...

There are two reasons for memleak in dsa_loop_init().

First, fixed_phy_register() create and register phy_device:

fixed_phy_register()
  get_phy_device()
    phy_device_create() # freed by phy_device_free()
  phy_device_register() # freed by phy_device_remove()

But fixed_phy_unregister() only calls phy_device_remove().
So the memory allocated in phy_device_create() is leaked.

Second, when mdio_driver_register() fail in dsa_loop_init(),
it just returns and there is no cleanup for phydevs.

Fix the problems by catching the error of mdio_driver_register()
in dsa_loop_init(), then calling both fixed_phy_unregister() and
phy_device_free() to release phydevs.
Also add a function for phydevs cleanup to avoid duplacate.

Fixes: 98cd1552ea ("net: dsa: Mock-up driver")
Signed-off-by: Chen Zhongjin <chenzhongjin@huawei.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Sasha Levin <sashal@kernel.org>
2022-11-10 18:17:16 +01:00
..
b53 net: dsa: b53: remove unnecessary spi_set_drvdata() 2022-07-06 19:49:59 -07:00
hirschmann net: dsa: hellcreek: Use the bitmap API to allocate bitmaps 2022-07-11 19:49:20 -07:00
microchip net: dsa: microchip: lan937x: fix maximum frame length check 2022-09-20 12:01:51 +02:00
mv88e6xxx net: dsa: mv88e6xxx: fix speed setting for CPU/DSA ports 2022-07-27 19:58:34 -07:00
ocelot net: dsa: felix: access QSYS_TAG_CONFIG under tas_lock in vsc9959_sched_speed_set 2022-09-07 13:44:04 +01:00
qca net: dsa: qca8k: fix ethtool autocast mib for big-endian systems 2022-10-29 10:08:32 +02:00
realtek net: dsa: realtek: rtl8365mb: handle PHY interface modes correctly 2022-06-16 20:44:47 -07:00
sja1105 net: dsa: sja1105: fix buffer overflow in sja1105_setup_devlink_regions() 2022-08-17 21:58:15 -07:00
xrs700x net: dsa: xrs700x: Use irqsave variant for u64 stats update 2022-08-29 13:02:26 +01:00
bcm_sf2.c net: dsa: bcm_sf2: force pause link settings 2022-06-23 20:46:39 -07:00
bcm_sf2.h net: dsa: bcm_sf2: refactor LED regs access 2021-12-30 17:28:32 -08:00
bcm_sf2_cfp.c net: dsa: bcm_sf2_cfp: fix an incorrect NULL check on list iterator 2022-03-28 14:38:38 -07:00
bcm_sf2_regs.h net: dsa: bcm_sf2: refactor LED regs access 2021-12-30 17:28:32 -08:00
dsa_loop.c net: dsa: Fix possible memory leaks in dsa_loop_init() 2022-11-10 18:17:16 +01:00
dsa_loop.h
dsa_loop_bdinfo.c
Kconfig net: dsa: qca8k: move driver to qca dir 2022-07-15 11:57:13 +01:00
lan9303-core.c net: dsa: pass extack to .port_bridge_join driver methods 2022-02-27 11:06:14 +00:00
lan9303.h net: dsa: be compatible with masters which unregister on shutdown 2021-09-19 12:08:37 +01:00
lan9303_i2c.c net: dsa: be compatible with masters which unregister on shutdown 2021-09-19 12:08:37 +01:00
lan9303_mdio.c net: dsa: be compatible with masters which unregister on shutdown 2021-09-19 12:08:37 +01:00
lantiq_gswip.c net: dsa: lantiq_gswip: Fix refcount leak in gswip_gphy_fw_list 2022-06-07 20:45:14 -07:00
lantiq_pce.h
Makefile net: dsa: qca8k: move driver to qca dir 2022-07-15 11:57:13 +01:00
mt7530.c net: mt7531: ensure all MACs are powered down before reset 2022-09-23 06:58:49 -07:00
mt7530.h net: dsa: mt7530: get cpu-port via dp->cpu_dp instead of constant 2022-06-14 22:35:16 -07:00
mv88e6060.c net: dsa: mv88e6060: prevent crash on an unused port 2022-08-12 17:24:44 -07:00
mv88e6060.h
rzn1_a5psw.c net: dsa: rzn1-a5psw: add missing of_node_put() in a5psw_pcs_get() 2022-06-30 21:07:03 -07:00
rzn1_a5psw.h net: dsa: rzn1-a5psw: add FDB support 2022-06-27 11:37:55 +01:00
vitesse-vsc73xx-core.c net: dsa: vsc73xxx: Get rid of duplicate of_node assignment 2021-12-03 14:13:02 +00:00
vitesse-vsc73xx-platform.c net: dsa: be compatible with masters which unregister on shutdown 2021-09-19 12:08:37 +01:00
vitesse-vsc73xx-spi.c net: dsa: vitesse-vsc73xx: silent spi_device_id warnings 2022-07-19 12:20:40 +02:00
vitesse-vsc73xx.h net: dsa: vsc73xxx: Make vsc73xx_remove() return void 2021-11-15 13:15:07 +00:00