[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <1314017401.2307.37.camel@edumazet-HP-Compaq-6005-Pro-SFF-PC>
Date: Mon, 22 Aug 2011 14:50:01 +0200
From: Eric Dumazet <eric.dumazet@...il.com>
To: Jan Beulich <JBeulich@...ell.com>
Cc: shemminger@...tta.com, davem@...emloft.net, netdev@...r.kernel.org
Subject: Re: net_device leak after "bridge: allow creating bridge devices
with netlink"?
Le lundi 22 août 2011 à 12:34 +0100, Jan Beulich a écrit :
> Stephen,
>
> directly returning the result of register_netdev() from br_add_bridge()
> would - to me - appear to be leaking "dev" in case of failure. Or am I
> overlooking some implicit mechanism by which this would get freed?
>
> Thanks, Jan
You're 100 % right, there is a leak here.
(But "ip" or "brctl" commands first check link already exist before
trying create it, so you need to tweak them to actually hit this bug)
We have to add a free_netdev() call to free the net_device.
diff --git a/net/bridge/br_if.c b/net/bridge/br_if.c
index 2cdf007..e738154 100644
--- a/net/bridge/br_if.c
+++ b/net/bridge/br_if.c
@@ -231,6 +231,7 @@ static struct net_bridge_port *new_nbp(struct net_bridge *br,
int br_add_bridge(struct net *net, const char *name)
{
struct net_device *dev;
+ int res;
dev = alloc_netdev(sizeof(struct net_bridge), name,
br_dev_setup);
@@ -240,7 +241,10 @@ int br_add_bridge(struct net *net, const char *name)
dev_net_set(dev, net);
- return register_netdev(dev);
+ res = register_netdev(dev);
+ if (res)
+ free_netdev(dev);
+ return res;
}
int br_del_bridge(struct net *net, const char *name)
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Powered by blists - more mailing lists