@@ -59,10 +59,38 @@ static int ip6_finish_output2(struct net *net, struct sock *sk, struct sk_buff *{structdst_entry*dst=skb_dst(skb);structnet_device*dev=dst->dev;+unsignedinthh_len=LL_RESERVED_SPACE(dev);+intdelta=hh_len-skb_headroom(skb);conststructin6_addr*nexthop;structneighbour*neigh;intret;+/* Be paranoid, rather than too clever. */+if(unlikely(delta>0)&&dev->header_ops){+/* pskb_expand_head() might crash, if skb is shared */+if(skb_shared(skb)){+structsk_buff*nskb=skb_clone(skb,GFP_ATOMIC);++if(likely(nskb)){+if(skb->sk)+skb_set_owner_w(skb,skb->sk);+consume_skb(skb);+}else{+kfree_skb(skb);+}+skb=nskb;+}+if(skb&&+pskb_expand_head(skb,SKB_DATA_ALIGN(delta),0,GFP_ATOMIC)){+kfree_skb(skb);+skb=NULL;+}+if(!skb){+IP6_INC_STATS(net,ip6_dst_idev(dst),IPSTATS_MIB_OUTDISCARDS);+return-ENOMEM;+}+}+if(ipv6_addr_is_multicast(&ipv6_hdr(skb)->daddr)){structinet6_dev*idev=ip6_dst_idev(skb_dst(skb));
From: Xin Long <lucien.xin@gmail.com>
[ Upstream commit 1d11fa231cabeae09a95cb3e4cf1d9dd34e00f08 ]
The doc draft-stewart-tsvwg-sctp-ipv4-00 that restricts 198 addresses
was never published. These addresses as private addresses should be
allowed to use in SCTP.
As Michael Tuexen suggested, this patch is to move 198 addresses from
unusable to private scope.
Reported-by: Sérgio <redacted>
Signed-off-by: Xin Long <lucien.xin@gmail.com>
Acked-by: Marcelo Ricardo Leitner <marcelo.leitner@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
include/net/sctp/constants.h | 4 +---
net/sctp/protocol.c | 3 ++-
2 files changed, 3 insertions(+), 4 deletions(-)
@@ -328,8 +328,7 @@ enum {#define SCTP_SCOPE_POLICY_MAX SCTP_SCOPE_POLICY_LINK/* Based on IPv4 scoping <draft-stewart-tsvwg-sctp-ipv4-00.txt>,-*SCTPIPv4unusableaddresses:0.0.0.0/8,224.0.0.0/4,198.18.0.0/24,-*192.88.99.0/24.+*SCTPIPv4unusableaddresses:0.0.0.0/8,224.0.0.0/4,192.88.99.0/24.*Also,RFC8.4,non-unicastaddressesarenotconsideredvalidSCTP*addresses.*/
@@ -337,7 +336,6 @@ enum {((htonl(INADDR_BROADCAST)==a)||\ipv4_is_multicast(a)||\ipv4_is_zeronet(a)||\-ipv4_is_test_198(a)||\ipv4_is_anycast_6to4(a))/* Flags used for the bind address copy functions. */
From: Eric Dumazet <edumazet@google.com>
[ Upstream commit 0dbffbb5335a1e3aa6855e4ee317e25e669dd302 ]
sk_ll_usec is read locklessly from sk_can_busy_loop()
while another thread can change its value in sock_setsockopt()
This is correct but needs annotations.
BUG: KCSAN: data-race in __skb_try_recv_datagram / sock_setsockopt
write to 0xffff88814eb5f904 of 4 bytes by task 14011 on cpu 0:
sock_setsockopt+0x1287/0x2090 net/core/sock.c:1175
__sys_setsockopt+0x14f/0x200 net/socket.c:2100
__do_sys_setsockopt net/socket.c:2115 [inline]
__se_sys_setsockopt net/socket.c:2112 [inline]
__x64_sys_setsockopt+0x62/0x70 net/socket.c:2112
do_syscall_64+0x4a/0x90 arch/x86/entry/common.c:47
entry_SYSCALL_64_after_hwframe+0x44/0xae
read to 0xffff88814eb5f904 of 4 bytes by task 14001 on cpu 1:
sk_can_busy_loop include/net/busy_poll.h:41 [inline]
__skb_try_recv_datagram+0x14f/0x320 net/core/datagram.c:273
unix_dgram_recvmsg+0x14c/0x870 net/unix/af_unix.c:2101
unix_seqpacket_recvmsg+0x5a/0x70 net/unix/af_unix.c:2067
____sys_recvmsg+0x15d/0x310 include/linux/uio.h:244
___sys_recvmsg net/socket.c:2598 [inline]
do_recvmmsg+0x35c/0x9f0 net/socket.c:2692
__sys_recvmmsg net/socket.c:2771 [inline]
__do_sys_recvmmsg net/socket.c:2794 [inline]
__se_sys_recvmmsg net/socket.c:2787 [inline]
__x64_sys_recvmmsg+0xcf/0x150 net/socket.c:2787
do_syscall_64+0x4a/0x90 arch/x86/entry/common.c:47
entry_SYSCALL_64_after_hwframe+0x44/0xae
value changed: 0x00000000 -> 0x00000101
Reported by Kernel Concurrency Sanitizer on:
CPU: 1 PID: 14001 Comm: syz-executor.3 Not tainted 5.13.0-syzkaller #0
Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011
Signed-off-by: Eric Dumazet <edumazet@google.com>
Reported-by: syzbot <redacted>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
include/net/busy_poll.h | 2 +-
net/core/sock.c | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
@@ -1098,7 +1098,7 @@ int sock_setsockopt(struct socket *sock, int level, int optname,if(val<0)ret=-EINVAL;else-sk->sk_ll_usec=val;+WRITE_ONCE(sk->sk_ll_usec,val);}break;#endif