[PATCH net] ipv6: Fix return value of ipv6_mc_may_pull() for malformed packets

Subsystems: networking [general], networking [ipv4/ipv6], the rest

STALE2552d

6 messages, 4 authors, 2019-08-20 · open the first message on its own page

[PATCH net] ipv6: Fix return value of ipv6_mc_may_pull() for malformed packets

From: Stefano Brivio <hidden>
Date: 2019-08-12 22:46:06

Commit ba5ea614622d ("bridge: simplify ip_mc_check_igmp() and
ipv6_mc_check_mld() calls") replaces direct calls to pskb_may_pull()
in br_ipv6_multicast_mld2_report() with calls to ipv6_mc_may_pull(),
that returns -EINVAL on buffers too short to be valid IPv6 packets,
while maintaining the previous handling of the return code.

This leads to the direct opposite of the intended effect: if the
packet is malformed, -EINVAL evaluates as true, and we'll happily
proceed with the processing.

Return 0 if the packet is too short, in the same way as this was
fixed for IPv4 by commit 083b78a9ed64 ("ip: fix ip_mc_may_pull()
return value").

I don't have a reproducer for this, unlike the one referred to by
the IPv4 commit, but this is clearly broken.

Fixes: ba5ea614622d ("bridge: simplify ip_mc_check_igmp() and ipv6_mc_check_mld() calls")
Signed-off-by: Stefano Brivio <redacted>
---
 include/net/addrconf.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/include/net/addrconf.h b/include/net/addrconf.h
index becdad576859..3f62b347b04a 100644
--- a/include/net/addrconf.h
+++ b/include/net/addrconf.h
@@ -206,7 +206,7 @@ static inline int ipv6_mc_may_pull(struct sk_buff *skb,
 				   unsigned int len)
 {
 	if (skb_transport_offset(skb) + ipv6_transport_len(skb) < len)
-		return -EINVAL;
+		return 0;
 
 	return pskb_may_pull(skb, len);
 }
-- 
2.20.1

Re: [PATCH net] ipv6: Fix return value of ipv6_mc_may_pull() for malformed packets

From: Guillaume Nault <hidden>
Date: 2019-08-12 23:09:00

On Tue, Aug 13, 2019 at 12:46:01AM +0200, Stefano Brivio wrote:
quoted hunk
Commit ba5ea614622d ("bridge: simplify ip_mc_check_igmp() and
ipv6_mc_check_mld() calls") replaces direct calls to pskb_may_pull()
in br_ipv6_multicast_mld2_report() with calls to ipv6_mc_may_pull(),
that returns -EINVAL on buffers too short to be valid IPv6 packets,
while maintaining the previous handling of the return code.

This leads to the direct opposite of the intended effect: if the
packet is malformed, -EINVAL evaluates as true, and we'll happily
proceed with the processing.

Return 0 if the packet is too short, in the same way as this was
fixed for IPv4 by commit 083b78a9ed64 ("ip: fix ip_mc_may_pull()
return value").

I don't have a reproducer for this, unlike the one referred to by
the IPv4 commit, but this is clearly broken.

Fixes: ba5ea614622d ("bridge: simplify ip_mc_check_igmp() and ipv6_mc_check_mld() calls")
Signed-off-by: Stefano Brivio <redacted>
---
 include/net/addrconf.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/include/net/addrconf.h b/include/net/addrconf.h
index becdad576859..3f62b347b04a 100644
--- a/include/net/addrconf.h
+++ b/include/net/addrconf.h
@@ -206,7 +206,7 @@ static inline int ipv6_mc_may_pull(struct sk_buff *skb,
 				   unsigned int len)
 {
 	if (skb_transport_offset(skb) + ipv6_transport_len(skb) < len)
-		return -EINVAL;
+		return 0;
 
 	return pskb_may_pull(skb, len);
 }
Acked-by: Guillaume Nault <redacted>

Re: [PATCH net] ipv6: Fix return value of ipv6_mc_may_pull() for malformed packets

From: David Miller <davem@davemloft.net>
Date: 2019-08-14 16:59:01

From: Stefano Brivio <redacted>
Date: Tue, 13 Aug 2019 00:46:01 +0200
Commit ba5ea614622d ("bridge: simplify ip_mc_check_igmp() and
ipv6_mc_check_mld() calls") replaces direct calls to pskb_may_pull()
in br_ipv6_multicast_mld2_report() with calls to ipv6_mc_may_pull(),
that returns -EINVAL on buffers too short to be valid IPv6 packets,
while maintaining the previous handling of the return code.

This leads to the direct opposite of the intended effect: if the
packet is malformed, -EINVAL evaluates as true, and we'll happily
proceed with the processing.

Return 0 if the packet is too short, in the same way as this was
fixed for IPv4 by commit 083b78a9ed64 ("ip: fix ip_mc_may_pull()
return value").

I don't have a reproducer for this, unlike the one referred to by
the IPv4 commit, but this is clearly broken.

Fixes: ba5ea614622d ("bridge: simplify ip_mc_check_igmp() and ipv6_mc_check_mld() calls")
Signed-off-by: Stefano Brivio <redacted>
Applied and queued up for -stable.

Re: [PATCH net] ipv6: Fix return value of ipv6_mc_may_pull() for malformed packets

From: Linus Lüssing <hidden>
Date: 2019-08-14 18:31:54

On Wed, Aug 14, 2019 at 12:58:58PM -0400, David Miller wrote:
From: Stefano Brivio <redacted>
Date: Tue, 13 Aug 2019 00:46:01 +0200
quoted
Commit ba5ea614622d ("bridge: simplify ip_mc_check_igmp() and
ipv6_mc_check_mld() calls") replaces direct calls to pskb_may_pull()
in br_ipv6_multicast_mld2_report() with calls to ipv6_mc_may_pull(),
that returns -EINVAL on buffers too short to be valid IPv6 packets,
while maintaining the previous handling of the return code.

This leads to the direct opposite of the intended effect: if the
packet is malformed, -EINVAL evaluates as true, and we'll happily
proceed with the processing.

Return 0 if the packet is too short, in the same way as this was
fixed for IPv4 by commit 083b78a9ed64 ("ip: fix ip_mc_may_pull()
return value").

I don't have a reproducer for this, unlike the one referred to by
the IPv4 commit, but this is clearly broken.

Fixes: ba5ea614622d ("bridge: simplify ip_mc_check_igmp() and ipv6_mc_check_mld() calls")
Signed-off-by: Stefano Brivio <redacted>
Applied and queued up for -stable.
Urgh, sorry... and thanks for the fix(es), absolutely right...

Re: [PATCH net] ipv6: Fix return value of ipv6_mc_may_pull() for malformed packets

From: Stefano Brivio <hidden>
Date: 2019-08-19 10:13:00

Hi,

On Wed, 14 Aug 2019 12:58:58 -0400 (EDT)
David Miller [off-list ref] wrote:
From: Stefano Brivio <redacted>
Date: Tue, 13 Aug 2019 00:46:01 +0200
quoted
Commit ba5ea614622d ("bridge: simplify ip_mc_check_igmp() and
ipv6_mc_check_mld() calls") replaces direct calls to pskb_may_pull()
in br_ipv6_multicast_mld2_report() with calls to ipv6_mc_may_pull(),
that returns -EINVAL on buffers too short to be valid IPv6 packets,
while maintaining the previous handling of the return code.

This leads to the direct opposite of the intended effect: if the
packet is malformed, -EINVAL evaluates as true, and we'll happily
proceed with the processing.

Return 0 if the packet is too short, in the same way as this was
fixed for IPv4 by commit 083b78a9ed64 ("ip: fix ip_mc_may_pull()
return value").

I don't have a reproducer for this, unlike the one referred to by
the IPv4 commit, but this is clearly broken.

Fixes: ba5ea614622d ("bridge: simplify ip_mc_check_igmp() and ipv6_mc_check_mld() calls")
Signed-off-by: Stefano Brivio <redacted>  
Applied and queued up for -stable.
I don't see this on net.git, but it's in your stable bundle on
Patchwork. Should I resend? Thanks.

-- 
Stefano

Re: [PATCH net] ipv6: Fix return value of ipv6_mc_may_pull() for malformed packets

From: David Miller <davem@davemloft.net>
Date: 2019-08-20 00:20:30

From: Stefano Brivio <redacted>
Date: Mon, 19 Aug 2019 12:12:52 +0200
I don't see this on net.git, but it's in your stable bundle on
Patchwork. Should I resend? Thanks.
I applied it on my laptop while travelling and never pushed it out so it
just rot there, sorry.

Fixed, should be in 'net' now.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help