Commit b2df5a84 authored by David S. Miller's avatar David S. Miller

net/caif: Fix dangling list pointer in freed object on error.

rtnl_link_ops->setup(), and the "setup" callback passed to alloc_netdev*(),
cannot make state changes which need to be undone on failure.  There is
no cleanup mechanism available at this point.

So we have to add the caif private instance to the global list once we
are sure that register_netdev() has succedded in ->newlink().

Otherwise, if register_netdev() fails, the caller will invoke free_netdev()
and we will have a reference to freed up memory on the chnl_net_list.
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 84e77a8b
...@@ -394,9 +394,7 @@ static void ipcaif_net_setup(struct net_device *dev) ...@@ -394,9 +394,7 @@ static void ipcaif_net_setup(struct net_device *dev)
priv->conn_req.sockaddr.u.dgm.connection_id = -1; priv->conn_req.sockaddr.u.dgm.connection_id = -1;
priv->flowenabled = false; priv->flowenabled = false;
ASSERT_RTNL();
init_waitqueue_head(&priv->netmgmt_wq); init_waitqueue_head(&priv->netmgmt_wq);
list_add(&priv->list_field, &chnl_net_list);
} }
...@@ -453,6 +451,8 @@ static int ipcaif_newlink(struct net *src_net, struct net_device *dev, ...@@ -453,6 +451,8 @@ static int ipcaif_newlink(struct net *src_net, struct net_device *dev,
ret = register_netdevice(dev); ret = register_netdevice(dev);
if (ret) if (ret)
pr_warn("device rtml registration failed\n"); pr_warn("device rtml registration failed\n");
else
list_add(&caifdev->list_field, &chnl_net_list);
return ret; return ret;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment