]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
net: ixp4xx_hss: fix duplicate HDLC netdev allocation
authorHaoxiang Li <haoxiang_li2024@163.com>
Mon, 22 Jun 2026 04:30:15 +0000 (12:30 +0800)
committerJakub Kicinski <kuba@kernel.org>
Thu, 25 Jun 2026 00:45:20 +0000 (17:45 -0700)
ixp4xx_hss_probe() allocates two HDLC netdevs. The first one is stored
in ndev, initialized, and registered with register_hdlc_device(). The
second one is stored in port->netdev and later used by the remove path
for unregister_hdlc_device() and free_netdev().

This means that the registered netdev is not the same object that is
unregistered and freed on remove. It also leaks the first allocation if
the second alloc_hdlcdev() call fails, and the first allocation is not
checked before ndev is used.

Older code allocated the HDLC netdev only once and stored the same object
in both the local variable and port->netdev. The buggy conversion split
this into two alloc_hdlcdev() calls. A later rename changed the local
variable name to ndev, but the underlying mismatch remained.

Fix this by allocating the HDLC netdev only once and assigning the same
object to port->netdev.

Fixes: 99ebe65eb9c0 ("net: ixp4xx_hss: move out assignment in if condition")
Cc: stable@vger.kernel.org
Signed-off-by: Haoxiang Li <haoxiang_li2024@163.com>
Reviewed-by: Linus Walleij <linusw@kernel.org>
Link: https://patch.msgid.link/20260622043015.643637-1-haoxiang_li2024@163.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/wan/ixp4xx_hss.c

index 720c5dc889ea322be63b8a47508b57a5a071a0c5..7f4645ff90aa92a7d619c3aff98af5841ee84050 100644 (file)
@@ -1487,11 +1487,11 @@ static int ixp4xx_hss_probe(struct platform_device *pdev)
                                     "unable to get CLK internal GPIO\n");
 
        ndev = alloc_hdlcdev(port);
-       port->netdev = alloc_hdlcdev(port);
-       if (!port->netdev) {
+       if (!ndev) {
                err = -ENOMEM;
                goto err_plat;
        }
+       port->netdev = ndev;
 
        SET_NETDEV_DEV(ndev, &pdev->dev);
        hdlc = dev_to_hdlc(ndev);