Subject: Re: [PATCH net-next v4] ipvlan: Initial check-in of the IPVLAN driver.

From: Toshiaki Makita <[email-masked]>
Date: Wed, 26 Nov 2014 15:41:53 +0900

Hi Mahesh,

I found that deleting the last ipvlan device triggers WARN_ON() in
rtmsg_ifinfo().
ipvlan_nl_fillinfo() seems to return -EINVAL in that case.

> +static int ipvlan_nl_fillinfo(struct sk_buff *skb,
> +			      const struct net_device *dev)
> +{
> +	struct ipvl_dev *ipvlan = netdev_priv(dev);
> +	struct ipvl_port *port = ipvlan_port_get_rtnl(ipvlan->phy_dev);
> +	int ret = -EINVAL;
> +
> +	if (!port)
> +		goto err;
> +
> +	ret = -EMSGSIZE;
> +	if (nla_put_u16(skb, IFLA_IPVLAN_MODE, port->mode))
> +		goto err;
> +
> +	return 0;
> +
> +err:
> +	return ret;
> +}

rollback_registered_many() calls rtmsg_ifinfo() after calling ndo_uninit().
ndo_uninit() (ipvlan_uninit() -> ipvlan_port_destroy() ->
netdev_rx_handler_unregister()) sets rx_handler_data into NULL.
So, we cannot dereference "port" in ipvlan_nl_fillinfo().

Maybe "mode" should belong to struct ipvl_dev?

Thanks,
Toshiaki Makita