ipv6 mcast: Fix incorrect use of pskb_may_pull().
Subsystems (3)
PATCH v2 1/1 ipv6 mcast: Fix incorrect use of pskb_may_pull().
pskb_may_pull(skb, len) ensures that len bytes from skb->data are available in a linear array. When pskb_may_pull() is being used multiple times for the same buffer without skb_pull(), the length is not accumulated.
For example, assuming that we have done:
pskb_may_pull(skb, sizeof(struct icmp6hdr))
Here, we have to do:
pskb_may_pull(skb, sizeof(struct mld2_query))
instead of:
pskb_may_pull(skb, sizeof(struct mld2_query) -
sizeof(struct icmp6hdr))
--- net/ipv6/mcast.c | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-)
net/ipv6/mcast.c +6 -7
@@ -1124,7 +1124,7 @@ int igmp6_event_query(struct sk_buff *skb)int mark =0 ;int len; -if (!pskb_may_pull (skb,sizeof (struct in6_addr ))) +if (!pskb_may_pull (skb,sizeof (struct icmp6hdr ) +sizeof (struct in6_addr )))return -EINVAL ;/* compute payload length excluding extension headers */
@@ -1165,9 +1165,7 @@ int igmp6_event_query(struct sk_buff *skb)/* clear deleted report items */ mld_clear_delrec (idev); }else if (len >=28 ) { -int srcs_offset =sizeof (struct mld2_query ) - -sizeof (struct icmp6hdr ); -if (!pskb_may_pull (skb, srcs_offset)) +if (!pskb_may_pull (skb,sizeof (struct mld2_query )))return -EINVAL ; mlh2 = (struct mld2_query *)skb_transport_header (skb);
@@ -1186,8 +1184,9 @@ int igmp6_event_query(struct sk_buff *skb) }/* mark sources to include, if group & source-specific */ if (mlh2->mld2q_nsrcs !=0 ) { -if (!pskb_may_pull (skb, srcs_offset + -ntohs (mlh2->mld2q_nsrcs) *sizeof (struct in6_addr ))) +if (!pskb_may_pull (skb, +sizeof (struct mld2_query ) + +ntohs (mlh2->mld2q_nsrcs) *sizeof (struct in6_addr )))return -EINVAL ; mlh2 = (struct mld2_query *)skb_transport_header (skb);
@@ -1248,7 +1247,7 @@ int igmp6_event_report(struct sk_buff *skb) skb->pkt_type != PACKET_BROADCAST)return 0 ; -if (!pskb_may_pull (skb,sizeof (*mld) -sizeof (struct icmp6hdr ))) +if (!pskb_may_pull (skb,sizeof (*mld)))return -EINVAL ; mld = (struct mld_msg *)icmp6_hdr (skb);
Signature · 1 line
1.7.9.5
Quoted 24 lines · YOSHIFUJI Hideaki
pskb_may_pull(skb, len)ensures that len bytes fromskb->dataare available in a linear array. Whenpskb_may_pull()is being used multiple times for the same buffer withoutskb_pull(), the length is not accumulated.For example, assuming that we have done:
pskb_may_pull(skb, sizeof(struct icmp6hdr))Here, we have to do:
pskb_may_pull(skb, sizeof(struct mld2_query))
instead of:
pskb_may_pull(skb,sizeof(struct mld2_query)-
sizeof(struct icmp6hdr))Signed-off-by YOSHIFUJI Hideaki <[email protected]>--- net/ipv6/mcast.c | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-)net/ipv6/mcast.c +0
-0
net/ipv6/mcast.c int igmp6_event_query(struct sk_buff *skb) · line 1129
Quoted 7 lines
net/ipv6/mcast.c +1
-1@@ -1124,7 +1124,7 @@ int igmp6_event_query(struct sk_buff *skb)int mark =0 ;int len; -if (!pskb_may_pull (skb,sizeof (struct in6_addr ))) +if (!pskb_may_pull (skb,sizeof (struct icmp6hdr ) +sizeof (struct in6_addr )))return -EINVAL ;
I am a bit confused by your patch.
igmp6_event_query() is called from icmpv6_rcv() _after_
pskb_pull(skb, sizeof(*hdr);
(hdr being struct icmp6hdr)
So this patch is wrong IMHO
Quoted 5 lines · Eric Dumazet
Quoted 4 lines · YOSHIFUJI Hideaki
pskb_may_pull(skb, len)ensures that len bytes fromskb->dataare available in a linear array. Whenpskb_may_pull()is being used multiple times for the same buffer withoutskb_pull(), the length is not accumulated.
:
Quoted 11 lines
net/ipv6/mcast.c int igmp6_event_query(struct sk_buff *skb) · line 1129
Quoted 8 lines
net/ipv6/mcast.c +1
-1@@ -1124,7 +1124,7 @@ int igmp6_event_query(struct sk_buff *skb)int mark =0 ;int len; -if (!pskb_may_pull (skb,sizeof (struct in6_addr ))) +if (!pskb_may_pull (skb,sizeof (struct icmp6hdr ) +sizeof (struct in6_addr )))return -EINVAL ;I am a bit confused by your patch.
Quoted 7 lines
igmp6_event_query()is called fromicmpv6_rcv()_after_pskb_pull(skb,
sizeof(*hdr);(hdr being struct icmp6hdr)
So this patch is wrong IMHO
Argh..I agree. I withdraw this one.
--yoshfuji