bridge: ensure to unlock in error path in br_multicast_query().
authorYOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
Sat, 13 Mar 2010 20:27:21 +0000 (12:27 -0800)
committerDavid S. Miller <davem@davemloft.net>
Sat, 13 Mar 2010 20:27:21 +0000 (12:27 -0800)
Signed-off-by: YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/bridge/br_multicast.c

index 12ce1eaa4f3e090ceb8e88b515c17d937bfcf9a5..fd96a8dc97f4b8c03bbeb67141d12669d817feb6 100644 (file)
@@ -823,6 +823,7 @@ static int br_multicast_query(struct net_bridge *br,
        unsigned long max_delay;
        unsigned long now = jiffies;
        __be32 group;
+       int err = 0;
 
        spin_lock(&br->multicast_lock);
        if (!netif_running(br->dev) ||
@@ -841,12 +842,14 @@ static int br_multicast_query(struct net_bridge *br,
                        group = 0;
                }
        } else {
-               if (!pskb_may_pull(skb, sizeof(struct igmpv3_query)))
-                       return -EINVAL;
+               if (!pskb_may_pull(skb, sizeof(struct igmpv3_query))) {
+                       err = -EINVAL;
+                       goto out;
+               }
 
                ih3 = igmpv3_query_hdr(skb);
                if (ih3->nsrcs)
-                       return 0;
+                       goto out;
 
                max_delay = ih3->code ? 1 :
                            IGMPV3_MRC(ih3->code) * (HZ / IGMP_TIMER_SCALE);
@@ -876,7 +879,7 @@ static int br_multicast_query(struct net_bridge *br,
 
 out:
        spin_unlock(&br->multicast_lock);
-       return 0;
+       return err;
 }
 
 static void br_multicast_leave_group(struct net_bridge *br,