提交 fcfb894d 编写于 作者: E Eric Dumazet 提交者: David S. Miller

net: bridge: fix net device refcount tracking issue in error path

I left one dev_put() in br_add_if() error path and sure enough
syzbot found its way.

As the tracker is allocated in new_nbp(), we must make sure
to properly free it.

We have to call dev_put_track(dev, &p->dev_tracker) before
@p object is freed, of course. This is not an issue because
br_add_if() owns a reference on @dev.

Fixes: b2dcdc7f ("net: bridge: add net device refcount tracker")
Signed-off-by: NEric Dumazet <edumazet@google.com>
Reported-by: Nsyzbot <syzkaller@googlegroups.com>
Signed-off-by: NDavid S. Miller <davem@davemloft.net>
上级 0bbed88a
...@@ -615,6 +615,7 @@ int br_add_if(struct net_bridge *br, struct net_device *dev, ...@@ -615,6 +615,7 @@ int br_add_if(struct net_bridge *br, struct net_device *dev,
err = dev_set_allmulti(dev, 1); err = dev_set_allmulti(dev, 1);
if (err) { if (err) {
br_multicast_del_port(p); br_multicast_del_port(p);
dev_put_track(dev, &p->dev_tracker);
kfree(p); /* kobject not yet init'd, manually free */ kfree(p); /* kobject not yet init'd, manually free */
goto err1; goto err1;
} }
...@@ -724,10 +725,10 @@ int br_add_if(struct net_bridge *br, struct net_device *dev, ...@@ -724,10 +725,10 @@ int br_add_if(struct net_bridge *br, struct net_device *dev,
sysfs_remove_link(br->ifobj, p->dev->name); sysfs_remove_link(br->ifobj, p->dev->name);
err2: err2:
br_multicast_del_port(p); br_multicast_del_port(p);
dev_put_track(dev, &p->dev_tracker);
kobject_put(&p->kobj); kobject_put(&p->kobj);
dev_set_allmulti(dev, -1); dev_set_allmulti(dev, -1);
err1: err1:
dev_put(dev);
return err; return err;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册