mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-11 15:40:50 +00:00
bridge: fix icmpv6 endian bug and other sparse warnings
Fix the warnings reported by sparse on recent bridge multicast changes. Mostly just rcu annotation issues but in this case sparse found a real bug! The ICMPv6 mld2 query mrc values is in network byte order. Signed-off-by: Stephen Hemminger <shemminger@vyatta.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
dc2e57340d
commit
eca2a43bb0
@ -622,7 +622,7 @@ out:
|
|||||||
struct net_bridge_port_group *br_multicast_new_port_group(
|
struct net_bridge_port_group *br_multicast_new_port_group(
|
||||||
struct net_bridge_port *port,
|
struct net_bridge_port *port,
|
||||||
struct br_ip *group,
|
struct br_ip *group,
|
||||||
struct net_bridge_port_group *next)
|
struct net_bridge_port_group __rcu *next)
|
||||||
{
|
{
|
||||||
struct net_bridge_port_group *p;
|
struct net_bridge_port_group *p;
|
||||||
|
|
||||||
@ -632,7 +632,7 @@ struct net_bridge_port_group *br_multicast_new_port_group(
|
|||||||
|
|
||||||
p->addr = *group;
|
p->addr = *group;
|
||||||
p->port = port;
|
p->port = port;
|
||||||
p->next = next;
|
rcu_assign_pointer(p->next, next);
|
||||||
hlist_add_head(&p->mglist, &port->mglist);
|
hlist_add_head(&p->mglist, &port->mglist);
|
||||||
setup_timer(&p->timer, br_multicast_port_group_expired,
|
setup_timer(&p->timer, br_multicast_port_group_expired,
|
||||||
(unsigned long)p);
|
(unsigned long)p);
|
||||||
@ -1138,7 +1138,7 @@ static int br_ip6_multicast_query(struct net_bridge *br,
|
|||||||
struct sk_buff *skb)
|
struct sk_buff *skb)
|
||||||
{
|
{
|
||||||
const struct ipv6hdr *ip6h = ipv6_hdr(skb);
|
const struct ipv6hdr *ip6h = ipv6_hdr(skb);
|
||||||
struct mld_msg *mld = (struct mld_msg *) icmp6_hdr(skb);
|
struct mld_msg *mld;
|
||||||
struct net_bridge_mdb_entry *mp;
|
struct net_bridge_mdb_entry *mp;
|
||||||
struct mld2_query *mld2q;
|
struct mld2_query *mld2q;
|
||||||
struct net_bridge_port_group *p;
|
struct net_bridge_port_group *p;
|
||||||
@ -1165,6 +1165,7 @@ static int br_ip6_multicast_query(struct net_bridge *br,
|
|||||||
if (max_delay)
|
if (max_delay)
|
||||||
group = &mld->mld_mca;
|
group = &mld->mld_mca;
|
||||||
} else if (skb->len >= sizeof(*mld2q)) {
|
} else if (skb->len >= sizeof(*mld2q)) {
|
||||||
|
u16 mrc;
|
||||||
if (!pskb_may_pull(skb, sizeof(*mld2q))) {
|
if (!pskb_may_pull(skb, sizeof(*mld2q))) {
|
||||||
err = -EINVAL;
|
err = -EINVAL;
|
||||||
goto out;
|
goto out;
|
||||||
@ -1172,7 +1173,8 @@ static int br_ip6_multicast_query(struct net_bridge *br,
|
|||||||
mld2q = (struct mld2_query *)icmp6_hdr(skb);
|
mld2q = (struct mld2_query *)icmp6_hdr(skb);
|
||||||
if (!mld2q->mld2q_nsrcs)
|
if (!mld2q->mld2q_nsrcs)
|
||||||
group = &mld2q->mld2q_mca;
|
group = &mld2q->mld2q_mca;
|
||||||
max_delay = mld2q->mld2q_mrc ? MLDV2_MRC(mld2q->mld2q_mrc) : 1;
|
mrc = ntohs(mld2q->mld2q_mrc);
|
||||||
|
max_delay = mrc ? MLDV2_MRC(mrc) : 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!group)
|
if (!group)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user