wifi: wl3501_cs: Fix an error handling path in wl3501_probe()
authorChristophe JAILLET <christophe.jaillet@wanadoo.fr>
Sat, 20 May 2023 08:05:08 +0000 (10:05 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 19 Jul 2023 14:21:06 +0000 (16:21 +0200)
[ Upstream commit 391af06a02e7642039ac5f6c4b2c034ab0992b5d ]

Should wl3501_config() fail, some resources need to be released as already
done in the remove function.

Fixes: 15b99ac17295 ("[PATCH] pcmcia: add return value to _config() functions")
Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
Reviewed-by: Simon Horman <simon.horman@corigine.com>
Signed-off-by: Kalle Valo <kvalo@kernel.org>
Link: https://lore.kernel.org/r/7cc9c9316489b7d69b36aeb0edd3123538500b41.1684569865.git.christophe.jaillet@wanadoo.fr
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/net/wireless/wl3501_cs.c

index 7fb2f95..c45c4b7 100644 (file)
@@ -1862,6 +1862,7 @@ static int wl3501_probe(struct pcmcia_device *p_dev)
 {
        struct net_device *dev;
        struct wl3501_card *this;
+       int ret;
 
        /* The io structure describes IO port mapping */
        p_dev->resource[0]->end = 16;
@@ -1873,8 +1874,7 @@ static int wl3501_probe(struct pcmcia_device *p_dev)
 
        dev = alloc_etherdev(sizeof(struct wl3501_card));
        if (!dev)
-               goto out_link;
-
+               return -ENOMEM;
 
        dev->netdev_ops         = &wl3501_netdev_ops;
        dev->watchdog_timeo     = 5 * HZ;
@@ -1887,9 +1887,15 @@ static int wl3501_probe(struct pcmcia_device *p_dev)
        netif_stop_queue(dev);
        p_dev->priv = dev;
 
-       return wl3501_config(p_dev);
-out_link:
-       return -ENOMEM;
+       ret = wl3501_config(p_dev);
+       if (ret)
+               goto out_free_etherdev;
+
+       return 0;
+
+out_free_etherdev:
+       free_netdev(dev);
+       return ret;
 }
 
 static int wl3501_config(struct pcmcia_device *link)