| From foo@baz Thu Jun 8 08:58:26 CEST 2017 |
| From: Eric Dumazet <edumazet@google.com> |
| Date: Sat, 3 Jun 2017 09:29:25 -0700 |
| Subject: net: ping: do not abuse udp_poll() |
| |
| From: Eric Dumazet <edumazet@google.com> |
| |
| |
| [ Upstream commit 77d4b1d36926a9b8387c6b53eeba42bcaaffcea3 ] |
| |
| Alexander reported various KASAN messages triggered in recent kernels |
| |
| The problem is that ping sockets should not use udp_poll() in the first |
| place, and recent changes in UDP stack finally exposed this old bug. |
| |
| Fixes: c319b4d76b9e ("net: ipv4: add IPPROTO_ICMP socket kind") |
| Fixes: 6d0bfe226116 ("net: ipv6: Add IPv6 support to the ping socket.") |
| Signed-off-by: Eric Dumazet <edumazet@google.com> |
| Reported-by: Sasha Levin <alexander.levin@verizon.com> |
| Cc: Solar Designer <solar@openwall.com> |
| Cc: Vasiliy Kulikov <segoon@openwall.com> |
| Cc: Lorenzo Colitti <lorenzo@google.com> |
| Acked-By: Lorenzo Colitti <lorenzo@google.com> |
| Tested-By: Lorenzo Colitti <lorenzo@google.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| include/net/ipv6.h | 1 + |
| net/ipv4/af_inet.c | 2 +- |
| net/ipv6/ping.c | 2 +- |
| net/ipv6/raw.c | 2 +- |
| 4 files changed, 4 insertions(+), 3 deletions(-) |
| |
| --- a/include/net/ipv6.h |
| +++ b/include/net/ipv6.h |
| @@ -1001,6 +1001,7 @@ int inet6_hash_connect(struct inet_timew |
| */ |
| extern const struct proto_ops inet6_stream_ops; |
| extern const struct proto_ops inet6_dgram_ops; |
| +extern const struct proto_ops inet6_sockraw_ops; |
| |
| struct group_source_req; |
| struct group_filter; |
| --- a/net/ipv4/af_inet.c |
| +++ b/net/ipv4/af_inet.c |
| @@ -1015,7 +1015,7 @@ static struct inet_protosw inetsw_array[ |
| .type = SOCK_DGRAM, |
| .protocol = IPPROTO_ICMP, |
| .prot = &ping_prot, |
| - .ops = &inet_dgram_ops, |
| + .ops = &inet_sockraw_ops, |
| .flags = INET_PROTOSW_REUSE, |
| }, |
| |
| --- a/net/ipv6/ping.c |
| +++ b/net/ipv6/ping.c |
| @@ -198,7 +198,7 @@ static struct inet_protosw pingv6_protos |
| .type = SOCK_DGRAM, |
| .protocol = IPPROTO_ICMPV6, |
| .prot = &pingv6_prot, |
| - .ops = &inet6_dgram_ops, |
| + .ops = &inet6_sockraw_ops, |
| .flags = INET_PROTOSW_REUSE, |
| }; |
| |
| --- a/net/ipv6/raw.c |
| +++ b/net/ipv6/raw.c |
| @@ -1330,7 +1330,7 @@ void raw6_proc_exit(void) |
| #endif /* CONFIG_PROC_FS */ |
| |
| /* Same as inet6_dgram_ops, sans udp_poll. */ |
| -static const struct proto_ops inet6_sockraw_ops = { |
| +const struct proto_ops inet6_sockraw_ops = { |
| .family = PF_INET6, |
| .owner = THIS_MODULE, |
| .release = inet6_release, |