diff options
author | Tobias Klauser <tklauser@distanz.ch> | 2010-12-09 22:18:04 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2010-12-10 16:00:39 -0500 |
commit | 4c0833bcd4d302fe783b9f8286a00ca2999d6200 (patch) | |
tree | 9f93e17facfe15540e51e3b29b6ca0f21a0d235f /net/bridge | |
parent | eaa7dcde1d092c792cbca4be81d2e506e84c6122 (diff) |
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/bridge')
-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 326e599f83fb..85a0398b221e 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( | |||
654 | struct net_bridge_mdb_htable *mdb; | 654 | struct net_bridge_mdb_htable *mdb; |
655 | struct net_bridge_mdb_entry *mp; | 655 | struct net_bridge_mdb_entry *mp; |
656 | int hash; | 656 | int hash; |
657 | int err; | ||
657 | 658 | ||
658 | mdb = rcu_dereference_protected(br->mdb, 1); | 659 | mdb = rcu_dereference_protected(br->mdb, 1); |
659 | if (!mdb) { | 660 | if (!mdb) { |
660 | if (br_mdb_rehash(&br->mdb, BR_HASH_SIZE, 0)) | 661 | err = br_mdb_rehash(&br->mdb, BR_HASH_SIZE, 0); |
661 | return NULL; | 662 | if (err) |
663 | return ERR_PTR(err); | ||
662 | goto rehash; | 664 | goto rehash; |
663 | } | 665 | } |
664 | 666 | ||
@@ -680,7 +682,7 @@ rehash: | |||
680 | 682 | ||
681 | mp = kzalloc(sizeof(*mp), GFP_ATOMIC); | 683 | mp = kzalloc(sizeof(*mp), GFP_ATOMIC); |
682 | if (unlikely(!mp)) | 684 | if (unlikely(!mp)) |
683 | goto out; | 685 | return ERR_PTR(-ENOMEM); |
684 | 686 | ||
685 | mp->br = br; | 687 | mp->br = br; |
686 | mp->addr = *group; | 688 | mp->addr = *group; |
@@ -713,7 +715,7 @@ static int br_multicast_add_group(struct net_bridge *br, | |||
713 | 715 | ||
714 | mp = br_multicast_new_group(br, port, group); | 716 | mp = br_multicast_new_group(br, port, group); |
715 | err = PTR_ERR(mp); | 717 | err = PTR_ERR(mp); |
716 | if (unlikely(IS_ERR(mp) || !mp)) | 718 | if (IS_ERR(mp)) |
717 | goto err; | 719 | goto err; |
718 | 720 | ||
719 | if (!port) { | 721 | if (!port) { |