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.
Unified · Split
| @@ -622,7 +622,7 @@ out: · 621 unmodified lines | ||
| 622 | 622 | struct net_bridge_port_group *br_multicast_new_port_group( |
| 623 | 623 | struct net_bridge_port *port, |
| 624 | 624 | struct br_ip *group, |
| 625 | − struct net_bridge_port_group *next) | |
| 625 | + struct net_bridge_port_group __rcu *next) | |
| 626 | 626 | { |
| 627 | 627 | struct net_bridge_port_group *p; |
| 628 | 628 | |
| @@ -632,7 +632,7 @@ struct net_bridge_port_group *br_multicast_new_port_group( · 3 unmodified lines | ||
| 632 | 632 | |
| 633 | 633 | p->addr = *group; |
| 634 | 634 | p->port = port; |
| 635 | − p->next = next; | |
| 635 | + rcu_assign_pointer(p->next, next); | |
| 636 | 636 | hlist_add_head(&p->mglist, &port->mglist); |
| 637 | 637 | setup_timer(&p->timer, br_multicast_port_group_expired, |
| 638 | 638 | (unsigned long)p); |
| @@ -1138,7 +1138,7 @@ static int br_ip6_multicast_query(struct net_bridge *br, · 499 unmodified lines | ||
| 1138 | 1138 | struct sk_buff *skb) |
| 1139 | 1139 | { |
| 1140 | 1140 | const struct ipv6hdr *ip6h = ipv6_hdr(skb); |
| 1141 | − struct mld_msg *mld = (struct mld_msg *) icmp6_hdr(skb); | |
| 1141 | + struct mld_msg *mld; | |
| 1142 | 1142 | struct net_bridge_mdb_entry *mp; |
| 1143 | 1143 | struct mld2_query *mld2q; |
| 1144 | 1144 | struct net_bridge_port_group *p; |
| @@ -1165,6 +1165,7 @@ static int br_ip6_multicast_query(struct net_bridge *br, · 20 unmodified lines | ||
| 1165 | 1165 | if (max_delay) |
| 1166 | 1166 | group = &mld->mld_mca; |
| 1167 | 1167 | } else if (skb->len >= sizeof(*mld2q)) { |
| 1168 | + u16 mrc; | |
| 1168 | 1169 | if (!pskb_may_pull(skb, sizeof(*mld2q))) { |
| 1169 | 1170 | err = -EINVAL; |
| 1170 | 1171 | goto out; |
| @@ -1172,7 +1173,8 @@ static int br_ip6_multicast_query(struct net_bridge *br, · 1 unmodified line | ||
| 1172 | 1173 | mld2q = (struct mld2_query *)icmp6_hdr(skb); |
| 1173 | 1174 | if (!mld2q->mld2q_nsrcs) |
| 1174 | 1175 | group = &mld2q->mld2q_mca; |
| 1175 | − max_delay = mld2q->mld2q_mrc ? MLDV2_MRC(mld2q->mld2q_mrc) : 1; | |
| 1176 | + mrc = ntohs(mld2q->mld2q_mrc); | |
| 1177 | + max_delay = mrc ? MLDV2_MRC(mrc) : 1; | |
| 1176 | 1178 | } |
| 1177 | 1179 | |
| 1178 | 1180 | if (!group) |