diff options
author | Tobias Klauser <tklauser@distanz.ch> | 2010-12-10 03:18:04 +0000 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2010-12-10 13:00:39 -0800 |
commit | 4c0833bcd4d302fe783b9f8286a00ca2999d6200 (patch) | |
tree | 9f93e17facfe15540e51e3b29b6ca0f21a0d235f /net | |
parent | eaa7dcde1d092c792cbca4be81d2e506e84c6122 (diff) | |
download | op-kernel-dev-4c0833bcd4d302fe783b9f8286a00ca2999d6200.zip op-kernel-dev-4c0833bcd4d302fe783b9f8286a00ca2999d6200.tar.gz |
bridge: Fix return values of br_multicast_add_group/br_multicast_new_group
If br_multicast_new_group returns NULL, we would return 0 (no error) to
the caller of br_multicast_add_group, which is not what we want. Instead
br_multicast_new_group should return ERR_PTR(-ENOMEM) in this case.
Also propagate the error number returned by br_mdb_rehash properly.
Signed-off-by: Tobias Klauser <tklauser@distanz.ch>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net')
-rw-r--r-- | net/bridge/br_multicast.c | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/net/bridge/br_multicast.c b/net/bridge/br_multicast.c index 326e599..85a0398 100644 --- a/net/bridge/br_multicast.c +++ b/net/bridge/br_multicast.c @@ -654,11 +654,13 @@ static struct net_bridge_mdb_entry *br_multicast_new_group( struct net_bridge_mdb_htable *mdb; struct net_bridge_mdb_entry *mp; int hash; + int err; mdb = rcu_dereference_protected(br->mdb, 1); if (!mdb) { - if (br_mdb_rehash(&br->mdb, BR_HASH_SIZE, 0)) - return NULL; + err = br_mdb_rehash(&br->mdb, BR_HASH_SIZE, 0); + if (err) + return ERR_PTR(err); goto rehash; } @@ -680,7 +682,7 @@ rehash: mp = kzalloc(sizeof(*mp), GFP_ATOMIC); if (unlikely(!mp)) - goto out; + return ERR_PTR(-ENOMEM); mp->br = br; mp->addr = *group; @@ -713,7 +715,7 @@ static int br_multicast_add_group(struct net_bridge *br, mp = br_multicast_new_group(br, port, group); err = PTR_ERR(mp); - if (unlikely(IS_ERR(mp) || !mp)) + if (IS_ERR(mp)) goto err; if (!port) { |