hc
2024-05-10 37f49e37ab4cb5d0bc4c60eb5c6d4dd57db767bb
kernel/net/core/stream.c
....@@ -32,7 +32,7 @@
3232 struct socket *sock = sk->sk_socket;
3333 struct socket_wq *wq;
3434
35
- if (sk_stream_is_writeable(sk) && sock) {
35
+ if (__sk_stream_is_writeable(sk, 1) && sock) {
3636 clear_bit(SOCK_NOSPACE, &sock->flags);
3737
3838 rcu_read_lock();
....@@ -73,8 +73,8 @@
7373 add_wait_queue(sk_sleep(sk), &wait);
7474 sk->sk_write_pending++;
7575 done = sk_wait_event(sk, timeo_p,
76
- !sk->sk_err &&
77
- !((1 << sk->sk_state) &
76
+ !READ_ONCE(sk->sk_err) &&
77
+ !((1 << READ_ONCE(sk->sk_state)) &
7878 ~(TCPF_ESTABLISHED | TCPF_CLOSE_WAIT)), &wait);
7979 remove_wait_queue(sk_sleep(sk), &wait);
8080 sk->sk_write_pending--;
....@@ -87,9 +87,9 @@
8787 * sk_stream_closing - Return 1 if we still have things to send in our buffers.
8888 * @sk: socket to verify
8989 */
90
-static inline int sk_stream_closing(struct sock *sk)
90
+static int sk_stream_closing(const struct sock *sk)
9191 {
92
- return (1 << sk->sk_state) &
92
+ return (1 << READ_ONCE(sk->sk_state)) &
9393 (TCPF_FIN_WAIT1 | TCPF_CLOSING | TCPF_LAST_ACK);
9494 }
9595
....@@ -142,8 +142,8 @@
142142
143143 set_bit(SOCK_NOSPACE, &sk->sk_socket->flags);
144144 sk->sk_write_pending++;
145
- sk_wait_event(sk, &current_timeo, sk->sk_err ||
146
- (sk->sk_shutdown & SEND_SHUTDOWN) ||
145
+ sk_wait_event(sk, &current_timeo, READ_ONCE(sk->sk_err) ||
146
+ (READ_ONCE(sk->sk_shutdown) & SEND_SHUTDOWN) ||
147147 (sk_stream_memory_free(sk) &&
148148 !vm_wait), &wait);
149149 sk->sk_write_pending--;
....@@ -159,7 +159,8 @@
159159 *timeo_p = current_timeo;
160160 }
161161 out:
162
- remove_wait_queue(sk_sleep(sk), &wait);
162
+ if (!sock_flag(sk, SOCK_DEAD))
163
+ remove_wait_queue(sk_sleep(sk), &wait);
163164 return err;
164165
165166 do_error:
....@@ -195,6 +196,12 @@
195196 /* First the read buffer. */
196197 __skb_queue_purge(&sk->sk_receive_queue);
197198
199
+ /* Next, the error queue.
200
+ * We need to use queue lock, because other threads might
201
+ * add packets to the queue without socket lock being held.
202
+ */
203
+ skb_queue_purge(&sk->sk_error_queue);
204
+
198205 /* Next, the write queue. */
199206 WARN_ON(!skb_queue_empty(&sk->sk_write_queue));
200207
....@@ -202,7 +209,6 @@
202209 sk_mem_reclaim(sk);
203210
204211 WARN_ON(sk->sk_wmem_queued);
205
- WARN_ON(sk->sk_forward_alloc);
206212
207213 /* It is _impossible_ for the backlog to contain anything
208214 * when we get here. All user references to this socket