hc
2024-12-19 9370bb92b2d16684ee45cf24e879c93c509162da
kernel/net/core/sock.c
....@@ -691,7 +691,8 @@
691691 return false;
692692 if (!sk)
693693 return true;
694
- switch (sk->sk_family) {
694
+ /* IPV6_ADDRFORM can change sk->sk_family under us. */
695
+ switch (READ_ONCE(sk->sk_family)) {
695696 case AF_INET:
696697 return inet_sk(sk)->mc_loop;
697698 #if IS_ENABLED(CONFIG_IPV6)
....@@ -1184,7 +1185,8 @@
11841185 cmpxchg(&sk->sk_pacing_status,
11851186 SK_PACING_NONE,
11861187 SK_PACING_NEEDED);
1187
- sk->sk_max_pacing_rate = ulval;
1188
+ /* Pairs with READ_ONCE() from sk_getsockopt() */
1189
+ WRITE_ONCE(sk->sk_max_pacing_rate, ulval);
11881190 sk->sk_pacing_rate = min(sk->sk_pacing_rate, ulval);
11891191 break;
11901192 }
....@@ -1332,11 +1334,11 @@
13321334 break;
13331335
13341336 case SO_SNDBUF:
1335
- v.val = sk->sk_sndbuf;
1337
+ v.val = READ_ONCE(sk->sk_sndbuf);
13361338 break;
13371339
13381340 case SO_RCVBUF:
1339
- v.val = sk->sk_rcvbuf;
1341
+ v.val = READ_ONCE(sk->sk_rcvbuf);
13401342 break;
13411343
13421344 case SO_REUSEADDR:
....@@ -1423,7 +1425,7 @@
14231425 break;
14241426
14251427 case SO_RCVLOWAT:
1426
- v.val = sk->sk_rcvlowat;
1428
+ v.val = READ_ONCE(sk->sk_rcvlowat);
14271429 break;
14281430
14291431 case SO_SNDLOWAT:
....@@ -1517,7 +1519,7 @@
15171519 if (!sock->ops->set_peek_off)
15181520 return -EOPNOTSUPP;
15191521
1520
- v.val = sk->sk_peek_off;
1522
+ v.val = READ_ONCE(sk->sk_peek_off);
15211523 break;
15221524 case SO_NOFCS:
15231525 v.val = sock_flag(sk, SOCK_NOFCS);
....@@ -1547,17 +1549,19 @@
15471549
15481550 #ifdef CONFIG_NET_RX_BUSY_POLL
15491551 case SO_BUSY_POLL:
1550
- v.val = sk->sk_ll_usec;
1552
+ v.val = READ_ONCE(sk->sk_ll_usec);
15511553 break;
15521554 #endif
15531555
15541556 case SO_MAX_PACING_RATE:
1557
+ /* The READ_ONCE() pair with the WRITE_ONCE() in sk_setsockopt() */
15551558 if (sizeof(v.ulval) != sizeof(v.val) && len >= sizeof(v.ulval)) {
15561559 lv = sizeof(v.ulval);
1557
- v.ulval = sk->sk_max_pacing_rate;
1560
+ v.ulval = READ_ONCE(sk->sk_max_pacing_rate);
15581561 } else {
15591562 /* 32bit version */
1560
- v.val = min_t(unsigned long, sk->sk_max_pacing_rate, ~0U);
1563
+ v.val = min_t(unsigned long, ~0U,
1564
+ READ_ONCE(sk->sk_max_pacing_rate));
15611565 }
15621566 break;
15631567
....@@ -1611,6 +1615,13 @@
16111615
16121616 case SO_BINDTOIFINDEX:
16131617 v.val = sk->sk_bound_dev_if;
1618
+ break;
1619
+
1620
+ case SO_NETNS_COOKIE:
1621
+ lv = sizeof(u64);
1622
+ if (len != lv)
1623
+ return -EINVAL;
1624
+ v.val64 = atomic64_read(&sock_net(sk)->net_cookie);
16141625 break;
16151626
16161627 default:
....@@ -2017,7 +2028,6 @@
20172028 {
20182029 u32 max_segs = 1;
20192030
2020
- sk_dst_set(sk, dst);
20212031 sk->sk_route_caps = dst->dev->features | sk->sk_route_forced_caps;
20222032 if (sk->sk_route_caps & NETIF_F_GSO)
20232033 sk->sk_route_caps |= NETIF_F_GSO_SOFTWARE;
....@@ -2032,6 +2042,7 @@
20322042 }
20332043 }
20342044 sk->sk_gso_max_segs = max_segs;
2045
+ sk_dst_set(sk, dst);
20352046 }
20362047 EXPORT_SYMBOL_GPL(sk_setup_caps);
20372048
....@@ -2176,13 +2187,24 @@
21762187 }
21772188 EXPORT_SYMBOL(sock_i_uid);
21782189
2190
+unsigned long __sock_i_ino(struct sock *sk)
2191
+{
2192
+ unsigned long ino;
2193
+
2194
+ read_lock(&sk->sk_callback_lock);
2195
+ ino = sk->sk_socket ? SOCK_INODE(sk->sk_socket)->i_ino : 0;
2196
+ read_unlock(&sk->sk_callback_lock);
2197
+ return ino;
2198
+}
2199
+EXPORT_SYMBOL(__sock_i_ino);
2200
+
21792201 unsigned long sock_i_ino(struct sock *sk)
21802202 {
21812203 unsigned long ino;
21822204
2183
- read_lock_bh(&sk->sk_callback_lock);
2184
- ino = sk->sk_socket ? SOCK_INODE(sk->sk_socket)->i_ino : 0;
2185
- read_unlock_bh(&sk->sk_callback_lock);
2205
+ local_bh_disable();
2206
+ ino = __sock_i_ino(sk);
2207
+ local_bh_enable();
21862208 return ino;
21872209 }
21882210 EXPORT_SYMBOL(sock_i_ino);
....@@ -2301,9 +2323,9 @@
23012323 prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE);
23022324 if (refcount_read(&sk->sk_wmem_alloc) < READ_ONCE(sk->sk_sndbuf))
23032325 break;
2304
- if (sk->sk_shutdown & SEND_SHUTDOWN)
2326
+ if (READ_ONCE(sk->sk_shutdown) & SEND_SHUTDOWN)
23052327 break;
2306
- if (sk->sk_err)
2328
+ if (READ_ONCE(sk->sk_err))
23072329 break;
23082330 timeo = schedule_timeout(timeo);
23092331 }
....@@ -2331,7 +2353,7 @@
23312353 goto failure;
23322354
23332355 err = -EPIPE;
2334
- if (sk->sk_shutdown & SEND_SHUTDOWN)
2356
+ if (READ_ONCE(sk->sk_shutdown) & SEND_SHUTDOWN)
23352357 goto failure;
23362358
23372359 if (sk_wmem_alloc_get(sk) < READ_ONCE(sk->sk_sndbuf))
....@@ -2711,7 +2733,7 @@
27112733 if (mem_cgroup_sockets_enabled && sk->sk_memcg)
27122734 mem_cgroup_uncharge_skmem(sk->sk_memcg, amount);
27132735
2714
- if (sk_under_memory_pressure(sk) &&
2736
+ if (sk_under_global_memory_pressure(sk) &&
27152737 (sk_memory_allocated(sk) < sk_prot_mem_limits(sk, 0)))
27162738 sk_leave_memory_pressure(sk);
27172739 }
....@@ -2732,7 +2754,7 @@
27322754
27332755 int sk_set_peek_off(struct sock *sk, int val)
27342756 {
2735
- sk->sk_peek_off = val;
2757
+ WRITE_ONCE(sk->sk_peek_off, val);
27362758 return 0;
27372759 }
27382760 EXPORT_SYMBOL_GPL(sk_set_peek_off);
....@@ -2979,7 +3001,7 @@
29793001 }
29803002 EXPORT_SYMBOL(sk_stop_timer_sync);
29813003
2982
-void sock_init_data(struct socket *sock, struct sock *sk)
3004
+void sock_init_data_uid(struct socket *sock, struct sock *sk, kuid_t uid)
29833005 {
29843006 sk_init_common(sk);
29853007 sk->sk_send_head = NULL;
....@@ -2998,11 +3020,10 @@
29983020 sk->sk_type = sock->type;
29993021 RCU_INIT_POINTER(sk->sk_wq, &sock->wq);
30003022 sock->sk = sk;
3001
- sk->sk_uid = SOCK_INODE(sock)->i_uid;
30023023 } else {
30033024 RCU_INIT_POINTER(sk->sk_wq, NULL);
3004
- sk->sk_uid = make_kuid(sock_net(sk)->user_ns, 0);
30053025 }
3026
+ sk->sk_uid = uid;
30063027
30073028 rwlock_init(&sk->sk_callback_lock);
30083029 if (sk->sk_kern_sock)
....@@ -3060,6 +3081,16 @@
30603081 refcount_set(&sk->sk_refcnt, 1);
30613082 atomic_set(&sk->sk_drops, 0);
30623083 }
3084
+EXPORT_SYMBOL(sock_init_data_uid);
3085
+
3086
+void sock_init_data(struct socket *sock, struct sock *sk)
3087
+{
3088
+ kuid_t uid = sock ?
3089
+ SOCK_INODE(sock)->i_uid :
3090
+ make_kuid(sock_net(sk)->user_ns, 0);
3091
+
3092
+ sock_init_data_uid(sock, sk, uid);
3093
+}
30633094 EXPORT_SYMBOL(sock_init_data);
30643095
30653096 void lock_sock_nested(struct sock *sk, int subclass)
....@@ -3069,11 +3100,12 @@
30693100 if (sk->sk_lock.owned)
30703101 __lock_sock(sk);
30713102 sk->sk_lock.owned = 1;
3072
- spin_unlock_bh(&sk->sk_lock.slock);
3103
+ spin_unlock(&sk->sk_lock.slock);
30733104 /*
30743105 * The sk_lock has mutex_lock() semantics here:
30753106 */
30763107 mutex_acquire(&sk->sk_lock.dep_map, subclass, 0, _RET_IP_);
3108
+ local_bh_enable();
30773109 }
30783110 EXPORT_SYMBOL(lock_sock_nested);
30793111
....@@ -3122,11 +3154,12 @@
31223154
31233155 __lock_sock(sk);
31243156 sk->sk_lock.owned = 1;
3125
- spin_unlock_bh(&sk->sk_lock.slock);
3157
+ spin_unlock(&sk->sk_lock.slock);
31263158 /*
31273159 * The sk_lock has mutex_lock() semantics here:
31283160 */
31293161 mutex_acquire(&sk->sk_lock.dep_map, 0, 0, _RET_IP_);
3162
+ local_bh_enable();
31303163 return true;
31313164 }
31323165 EXPORT_SYMBOL(lock_sock_fast);