Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

[BRIDGE]: fix locking and memory leak in br_add_bridge

There are several bugs in error handling in br_add_bridge:
- when dev_alloc_name fails, allocated net_device is not freed
- unregister_netdev is called when rtnl lock is held
- free_netdev is called before netdev_run_todo has a chance to be run after
unregistering net_device

Signed-off-by: Jiri Benc <jbenc@suse.cz>
Signed-off-by: Stephen Hemminger <shemminger@osdl.org>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Jiri Benc and committed by
David S. Miller
36485707 8c893ff6

+7 -12
+7 -12
net/bridge/br_if.c
··· 300 300 rtnl_lock(); 301 301 if (strchr(dev->name, '%')) { 302 302 ret = dev_alloc_name(dev, dev->name); 303 - if (ret < 0) 304 - goto err1; 303 + if (ret < 0) { 304 + free_netdev(dev); 305 + goto out; 306 + } 305 307 } 306 308 307 309 ret = register_netdevice(dev); 308 310 if (ret) 309 - goto err2; 311 + goto out; 310 312 311 313 ret = br_sysfs_addbr(dev); 312 314 if (ret) 313 - goto err3; 314 - rtnl_unlock(); 315 - return 0; 316 - 317 - err3: 318 - unregister_netdev(dev); 319 - err2: 320 - free_netdev(dev); 321 - err1: 315 + unregister_netdevice(dev); 316 + out: 322 317 rtnl_unlock(); 323 318 return ret; 324 319 }