On 05/07/2020 21:22, Linus Lüssing wrote: > Commit e57f61858b7c ("net: bridge: mcast: fix stale nsrcs pointer in > igmp3/mld2 report handling") introduced a small bug which would potentially > lead to accepting an MLD2 Report with a broken IPv6 header payload length > field. > > The check needs to take into account the 2 bytes for the "Number of > Sources" field in the "Multicast Address Record" before reading it. > And not the size of a pointer to this field. > > Fixes: e57f61858b7c ("net: bridge: mcast: fix stale nsrcs pointer in igmp3/mld2 report handling") > Signed-off-by: Linus Lüssing <linus.luessing@xxxxxxxxx> > --- > net/bridge/br_multicast.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > I'd rather be more concerned with it rejecting a valid report due to wrong size. The ptr size would always be bigger. :) Thanks! Acked-by: Nikolay Aleksandrov <nikolay@xxxxxxxxxxxxxxxxxxx> > diff --git a/net/bridge/br_multicast.c b/net/bridge/br_multicast.c > index 83490bf73a13..4c4a93abde68 100644 > --- a/net/bridge/br_multicast.c > +++ b/net/bridge/br_multicast.c > @@ -1000,21 +1000,21 @@ static int br_ip6_multicast_mld2_report(struct net_bridge *br, > num = ntohs(icmp6h->icmp6_dataun.un_data16[1]); > len = skb_transport_offset(skb) + sizeof(*icmp6h); > > for (i = 0; i < num; i++) { > __be16 *_nsrcs, __nsrcs; > u16 nsrcs; > > nsrcs_offset = len + offsetof(struct mld2_grec, grec_nsrcs); > > if (skb_transport_offset(skb) + ipv6_transport_len(skb) < > - nsrcs_offset + sizeof(_nsrcs)) > + nsrcs_offset + sizeof(__nsrcs)) > return -EINVAL; > > _nsrcs = skb_header_pointer(skb, nsrcs_offset, > sizeof(__nsrcs), &__nsrcs); > if (!_nsrcs) > return -EINVAL; > > nsrcs = ntohs(*_nsrcs); > grec_len = struct_size(grec, grec_src, nsrcs); > >