From: Greg Kroah-Hartman Date: Tue, 12 Mar 2019 18:56:10 +0000 (-0700) Subject: 4.4-stable patches X-Git-Tag: v5.0.2~6 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=2dd650e9a1cd4758d4f4a7370ec6c08a72ab0e76;p=thirdparty%2Fkernel%2Fstable-queue.git 4.4-stable patches added patches: udplite-call-proper-backlog-handlers.patch --- diff --git a/queue-4.4/series b/queue-4.4/series index 7ea75bb047d..d894bda9312 100644 --- a/queue-4.4/series +++ b/queue-4.4/series @@ -118,3 +118,4 @@ futex-rt_mutex-restructure-rt_mutex_finish_proxy_lock.patch arm-dts-exynos-add-minimal-clkout-parameters-to-exynos3250-pmu.patch revert-x86-platform-uv-use-efi_runtime_lock-to-seria.patch arm-dts-exynos-do-not-ignore-real-world-fuse-values-for-thermal-zone-0-on-exynos5420.patch +udplite-call-proper-backlog-handlers.patch diff --git a/queue-4.4/udplite-call-proper-backlog-handlers.patch b/queue-4.4/udplite-call-proper-backlog-handlers.patch new file mode 100644 index 00000000000..b1bb1a3eb8b --- /dev/null +++ b/queue-4.4/udplite-call-proper-backlog-handlers.patch @@ -0,0 +1,109 @@ +From 30c7be26fd3587abcb69587f781098e3ca2d565b Mon Sep 17 00:00:00 2001 +From: Eric Dumazet +Date: Tue, 22 Nov 2016 09:06:45 -0800 +Subject: udplite: call proper backlog handlers + +From: Eric Dumazet + +commit 30c7be26fd3587abcb69587f781098e3ca2d565b upstream. + +In commits 93821778def10 ("udp: Fix rcv socket locking") and +f7ad74fef3af ("net/ipv6/udp: UDP encapsulation: break backlog_rcv into +__udpv6_queue_rcv_skb") UDP backlog handlers were renamed, but UDPlite +was forgotten. + +This leads to crashes if UDPlite header is pulled twice, which happens +starting from commit e6afc8ace6dd ("udp: remove headers from UDP packets +before queueing") + +Bug found by syzkaller team, thanks a lot guys ! + +Note that backlog use in UDP/UDPlite is scheduled to be removed starting +from linux-4.10, so this patch is only needed up to linux-4.9 + +Fixes: 93821778def1 ("udp: Fix rcv socket locking") +Fixes: f7ad74fef3af ("net/ipv6/udp: UDP encapsulation: break backlog_rcv into __udpv6_queue_rcv_skb") +Fixes: e6afc8ace6dd ("udp: remove headers from UDP packets before queueing") +Signed-off-by: Eric Dumazet +Reported-by: Andrey Konovalov +Cc: Benjamin LaHaise +Cc: Herbert Xu +Signed-off-by: David S. Miller +Cc: Zubin Mithra +Signed-off-by: Greg Kroah-Hartman + +--- + net/ipv4/udp.c | 2 +- + net/ipv4/udp_impl.h | 2 +- + net/ipv4/udplite.c | 2 +- + net/ipv6/udp.c | 2 +- + net/ipv6/udp_impl.h | 2 +- + net/ipv6/udplite.c | 2 +- + 6 files changed, 6 insertions(+), 6 deletions(-) + +--- a/net/ipv4/udp.c ++++ b/net/ipv4/udp.c +@@ -1463,7 +1463,7 @@ static void udp_v4_rehash(struct sock *s + udp_lib_rehash(sk, new_hash); + } + +-static int __udp_queue_rcv_skb(struct sock *sk, struct sk_buff *skb) ++int __udp_queue_rcv_skb(struct sock *sk, struct sk_buff *skb) + { + int rc; + +--- a/net/ipv4/udp_impl.h ++++ b/net/ipv4/udp_impl.h +@@ -25,7 +25,7 @@ int udp_recvmsg(struct sock *sk, struct + int flags, int *addr_len); + int udp_sendpage(struct sock *sk, struct page *page, int offset, size_t size, + int flags); +-int udp_queue_rcv_skb(struct sock *sk, struct sk_buff *skb); ++int __udp_queue_rcv_skb(struct sock *sk, struct sk_buff *skb); + void udp_destroy_sock(struct sock *sk); + + #ifdef CONFIG_PROC_FS +--- a/net/ipv4/udplite.c ++++ b/net/ipv4/udplite.c +@@ -50,7 +50,7 @@ struct proto udplite_prot = { + .sendmsg = udp_sendmsg, + .recvmsg = udp_recvmsg, + .sendpage = udp_sendpage, +- .backlog_rcv = udp_queue_rcv_skb, ++ .backlog_rcv = __udp_queue_rcv_skb, + .hash = udp_lib_hash, + .unhash = udp_lib_unhash, + .get_port = udp_v4_get_port, +--- a/net/ipv6/udp.c ++++ b/net/ipv6/udp.c +@@ -585,7 +585,7 @@ out: + sock_put(sk); + } + +-static int __udpv6_queue_rcv_skb(struct sock *sk, struct sk_buff *skb) ++int __udpv6_queue_rcv_skb(struct sock *sk, struct sk_buff *skb) + { + int rc; + +--- a/net/ipv6/udp_impl.h ++++ b/net/ipv6/udp_impl.h +@@ -26,7 +26,7 @@ int compat_udpv6_getsockopt(struct sock + int udpv6_sendmsg(struct sock *sk, struct msghdr *msg, size_t len); + int udpv6_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, int noblock, + int flags, int *addr_len); +-int udpv6_queue_rcv_skb(struct sock *sk, struct sk_buff *skb); ++int __udpv6_queue_rcv_skb(struct sock *sk, struct sk_buff *skb); + void udpv6_destroy_sock(struct sock *sk); + + void udp_v6_clear_sk(struct sock *sk, int size); +--- a/net/ipv6/udplite.c ++++ b/net/ipv6/udplite.c +@@ -45,7 +45,7 @@ struct proto udplitev6_prot = { + .getsockopt = udpv6_getsockopt, + .sendmsg = udpv6_sendmsg, + .recvmsg = udpv6_recvmsg, +- .backlog_rcv = udpv6_queue_rcv_skb, ++ .backlog_rcv = __udpv6_queue_rcv_skb, + .hash = udp_lib_hash, + .unhash = udp_lib_unhash, + .get_port = udp_v6_get_port,