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
This patch should fix these issues. Signed-off-by: Jiri Benc <[EMAIL PROTECTED]> --- net/bridge/br_if.c | 15 ++++++--------- 1 files changed, 6 insertions(+), 9 deletions(-) --- dscape.orig/net/bridge/br_if.c +++ dscape/net/bridge/br_if.c @@ -301,25 +301,22 @@ int br_add_bridge(const char *name) if (strchr(dev->name, '%')) { ret = dev_alloc_name(dev, dev->name); if (ret < 0) - goto err1; + goto err; } ret = register_netdevice(dev); if (ret) - goto err2; + goto err; ret = br_sysfs_addbr(dev); if (ret) - goto err3; + unregister_netdevice(dev); rtnl_unlock(); - return 0; + return ret; - err3: - unregister_netdev(dev); - err2: - free_netdev(dev); - err1: + err: rtnl_unlock(); + free_netdev(dev); return ret; } -- Jiri Benc SUSE Labs - To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html