]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
4.4-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 12 Mar 2019 18:56:10 +0000 (11:56 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 12 Mar 2019 18:56:10 +0000 (11:56 -0700)
added patches:
udplite-call-proper-backlog-handlers.patch

queue-4.4/series
queue-4.4/udplite-call-proper-backlog-handlers.patch [new file with mode: 0644]

index 7ea75bb047d6995c934c09e4412f9300b1f93043..d894bda93124ca774f8e78d390cac42ff94b80bc 100644 (file)
@@ -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 (file)
index 0000000..b1bb1a3
--- /dev/null
@@ -0,0 +1,109 @@
+From 30c7be26fd3587abcb69587f781098e3ca2d565b Mon Sep 17 00:00:00 2001
+From: Eric Dumazet <edumazet@google.com>
+Date: Tue, 22 Nov 2016 09:06:45 -0800
+Subject: udplite: call proper backlog handlers
+
+From: Eric Dumazet <edumazet@google.com>
+
+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 <edumazet@google.com>
+Reported-by: Andrey Konovalov <andreyknvl@google.com>
+Cc: Benjamin LaHaise <bcrl@kvack.org>
+Cc: Herbert Xu <herbert@gondor.apana.org.au>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Cc: Zubin Mithra <zsm@chromium.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ 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,