From d0c13c584abb44a88bae22e81184faed3147fdaf Mon Sep 17 00:00:00 2001 From: Thomas Bogendoerfer Date: Jun 12 2020 09:26:29 +0000 Subject: ipv6: fix IPV6_ADDRFORM operation logic (bsc#1171662). --- diff --git a/patches.suse/ipv6-fix-IPV6_ADDRFORM-operation-logic.patch b/patches.suse/ipv6-fix-IPV6_ADDRFORM-operation-logic.patch new file mode 100644 index 0000000..2595cdc --- /dev/null +++ b/patches.suse/ipv6-fix-IPV6_ADDRFORM-operation-logic.patch @@ -0,0 +1,75 @@ +From: Hangbin Liu +Date: Mon, 1 Jun 2020 11:55:03 +0800 +Subject: ipv6: fix IPV6_ADDRFORM operation logic +Patch-mainline: v5.8-rc1 +Git-commit: 79a1f0ccdbb4ad700590f61b00525b390cb53905 +References: bsc#1171662 + +Socket option IPV6_ADDRFORM supports UDP/UDPLITE and TCP at present. +Previously the checking logic looks like: +if (sk->sk_protocol == IPPROTO_UDP || sk->sk_protocol == IPPROTO_UDPLITE) + do_some_check; +else if (sk->sk_protocol != IPPROTO_TCP) + break; + +After commit b6f6118901d1 ("ipv6: restrict IPV6_ADDRFORM operation"), TCP +was blocked as the logic changed to: +if (sk->sk_protocol == IPPROTO_UDP || sk->sk_protocol == IPPROTO_UDPLITE) + do_some_check; +else if (sk->sk_protocol == IPPROTO_TCP) + do_some_check; + break; +else + break; + +Then after commit 82c9ae440857 ("ipv6: fix restrict IPV6_ADDRFORM operation") +UDP/UDPLITE were blocked as the logic changed to: +if (sk->sk_protocol == IPPROTO_UDP || sk->sk_protocol == IPPROTO_UDPLITE) + do_some_check; +if (sk->sk_protocol == IPPROTO_TCP) + do_some_check; + +if (sk->sk_protocol != IPPROTO_TCP) + break; + +Fix it by using Eric's code and simply remove the break in TCP check, which +looks like: +if (sk->sk_protocol == IPPROTO_UDP || sk->sk_protocol == IPPROTO_UDPLITE) + do_some_check; +else if (sk->sk_protocol == IPPROTO_TCP) + do_some_check; +else + break; + +Fixes: 82c9ae440857 ("ipv6: fix restrict IPV6_ADDRFORM operation") +Signed-off-by: Hangbin Liu +Signed-off-by: David S. Miller +Acked-by: Thomas Bogendoerfer +--- + net/ipv6/ipv6_sockglue.c | 13 +++++++------ + 1 file changed, 7 insertions(+), 6 deletions(-) + +--- a/net/ipv6/ipv6_sockglue.c ++++ b/net/ipv6/ipv6_sockglue.c +@@ -183,14 +183,15 @@ static int do_ipv6_setsockopt(struct soc + retv = -EBUSY; + break; + } +- } +- if (sk->sk_protocol == IPPROTO_TCP && +- sk->sk_prot != &tcpv6_prot) { +- retv = -EBUSY; ++ } else if (sk->sk_protocol == IPPROTO_TCP) { ++ if (sk->sk_prot != &tcpv6_prot) { ++ retv = -EBUSY; ++ break; ++ } ++ } else { + break; + } +- if (sk->sk_protocol != IPPROTO_TCP) +- break; ++ + if (sk->sk_state != TCP_ESTABLISHED) { + retv = -ENOTCONN; + break; diff --git a/series.conf b/series.conf index 8684eb3..3078148 100644 --- a/series.conf +++ b/series.conf @@ -12399,6 +12399,7 @@ patches.suse/ath10k-Remove-ath10k_qmi_register_service_notifier-d.patch patches.suse/Bluetooth-btmtkuart-Improve-exception-handling-in-bt.patch patches.suse/ice-Fix-inability-to-set-channels-when-down.patch + patches.suse/ipv6-fix-IPV6_ADDRFORM-operation-logic.patch patches.suse/libbpf-Fix-perf_buffer__free-API-for-sparse-allocs.patch patches.suse/bpf-Fix-map-permissions-check.patch patches.suse/selftests-bpf-flow_dissector-Close-TAP-device-FD-aft.patch