Linus Lüssing
2020-Jul-05 18:22 UTC
[Bridge] [PATCH net] bridge: mcast: Fix MLD2 Report IPv6 payload length check
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 at c0d3.blue> --- net/bridge/br_multicast.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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); -- 2.27.0
Nikolay Aleksandrov
2020-Jul-05 18:33 UTC
[Bridge] [PATCH net] bridge: mcast: Fix MLD2 Report IPv6 payload length check
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 at c0d3.blue> > --- > 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 at cumulusnetworks.com>> 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); > >