[PATCH 05/12] net: smc911x: Fix potential memleak() in init fail path
Masahiro Yamada
yamada.masahiro at socionext.com
Tue Mar 17 07:21:58 CET 2020
On Mon, Mar 16, 2020 at 1:59 AM Marek Vasut <marek.vasut at gmail.com> wrote:
>
> Fix memleak in the init fail path, where if allocation or registration
> of MDIO bus fails, then ethernet interface is not unregistered and the
> private data are not freed, yet the probe function reports a failure.
>
> Signed-off-by: Marek Vasut <marek.vasut+renesas at gmail.com>
> Cc: Joe Hershberger <joe.hershberger at ni.com>
> Cc: Masahiro Yamada <yamada.masahiro at socionext.com>
> ---
> drivers/net/smc911x.c | 14 +++++++++++---
> 1 file changed, 11 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/net/smc911x.c b/drivers/net/smc911x.c
> index 81f8f0d017..44cb45af61 100644
> --- a/drivers/net/smc911x.c
> +++ b/drivers/net/smc911x.c
> @@ -249,7 +249,7 @@ int smc911x_initialize(u8 dev_num, int base_addr)
>
> dev = calloc(1, sizeof(*dev));
> if (!dev) {
> - return -1;
> + return -ENODEV;
> }
Our convention is to return -ENOMEM
when memory allocation fails.
If you like to do some additional cleanups here,
you can remove the unneeded braces around the single
statement, which will fix the checkpatch warning.
>
> dev->iobase = base_addr;
> @@ -283,15 +283,23 @@ int smc911x_initialize(u8 dev_num, int base_addr)
> #if defined(CONFIG_MII) || defined(CONFIG_CMD_MII)
> int retval;
> struct mii_dev *mdiodev = mdio_alloc();
> - if (!mdiodev)
> + if (!mdiodev) {
> + eth_unregister(dev);
> + free(dev);
> return -ENOMEM;
> + }
> +
> strncpy(mdiodev->name, dev->name, MDIO_NAME_LEN);
> mdiodev->read = smc911x_miiphy_read;
> mdiodev->write = smc911x_miiphy_write;
>
> retval = mdio_register(mdiodev);
> - if (retval < 0)
> + if (retval < 0) {
> + mdio_free(mdiodev);
> + eth_unregister(dev);
> + free(dev);
> return retval;
Using "goto <label>" is a general tip to
simplify the failure path.
> + }
> #endif
>
> return 1;
> --
> 2.25.0
>
--
Best Regards
Masahiro Yamada
More information about the U-Boot
mailing list