aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv4/tcp_input.c
diff options
context:
space:
mode:
authorGuillaume Nault <gnault@redhat.com>2019-03-19 11:05:44 -0400
committerDavid S. Miller <davem@davemloft.net>2019-03-19 17:13:01 -0400
commit9403cf2302588022d06f1878b072d3f6933021f0 (patch)
treed69594772fc7481e9db2f296b0c4ac8fe6d4a591 /net/ipv4/tcp_input.c
parent56dc6d6355744b1c890dd09a6627e0c492f83bb9 (diff)
tcp: free request sock directly upon TFO or syncookies error
Since the request socket is created locally, it'd make more sense to use reqsk_free() instead of reqsk_put() in TFO and syncookies' error path. However, tcp_get_cookie_sock() may set ->rsk_refcnt before freeing the socket; tcp_conn_request() may also have non-null ->rsk_refcnt because of tcp_try_fastopen(). In both cases 'req' hasn't been exposed to the outside world and is safe to free immediately, but that'd trigger the WARN_ON_ONCE in reqsk_free(). Define __reqsk_free() for these situations where we know nobody's referencing the socket, even though ->rsk_refcnt might be non-null. Now we can consolidate the error path of tcp_get_cookie_sock() and tcp_conn_request(). Signed-off-by: Guillaume Nault <gnault@redhat.com> Signed-off-by: Eric Dumazet <edumazet@google.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv4/tcp_input.c')
-rw-r--r--net/ipv4/tcp_input.c5
1 files changed, 2 insertions, 3 deletions
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c
index 5def3c48870e..5dfbc333e79a 100644
--- a/net/ipv4/tcp_input.c
+++ b/net/ipv4/tcp_input.c
@@ -6502,8 +6502,7 @@ int tcp_conn_request(struct request_sock_ops *rsk_ops,
6502 reqsk_fastopen_remove(fastopen_sk, req, false); 6502 reqsk_fastopen_remove(fastopen_sk, req, false);
6503 bh_unlock_sock(fastopen_sk); 6503 bh_unlock_sock(fastopen_sk);
6504 sock_put(fastopen_sk); 6504 sock_put(fastopen_sk);
6505 reqsk_put(req); 6505 goto drop_and_free;
6506 goto drop;
6507 } 6506 }
6508 sk->sk_data_ready(sk); 6507 sk->sk_data_ready(sk);
6509 bh_unlock_sock(fastopen_sk); 6508 bh_unlock_sock(fastopen_sk);
@@ -6527,7 +6526,7 @@ int tcp_conn_request(struct request_sock_ops *rsk_ops,
6527drop_and_release: 6526drop_and_release:
6528 dst_release(dst); 6527 dst_release(dst);
6529drop_and_free: 6528drop_and_free:
6530 reqsk_free(req); 6529 __reqsk_free(req);
6531drop: 6530drop:
6532 tcp_listendrop(sk); 6531 tcp_listendrop(sk);
6533 return 0; 6532 return 0;