| From foo@baz Thu Sep 14 23:20:44 PDT 2017 |
| From: Eric Dumazet <edumazet@google.com> |
| Date: Fri, 8 Sep 2017 12:44:47 -0700 |
| Subject: tcp: fix a request socket leak |
| |
| From: Eric Dumazet <edumazet@google.com> |
| |
| |
| [ Upstream commit 1f3b359f1004bd34b7b0bad70b93e3c7af92a37b ] |
| |
| While the cited commit fixed a possible deadlock, it added a leak |
| of the request socket, since reqsk_put() must be called if the BPF |
| filter decided the ACK packet must be dropped. |
| |
| Fixes: d624d276d1dd ("tcp: fix possible deadlock in TCP stack vs BPF filter") |
| Signed-off-by: Eric Dumazet <edumazet@google.com> |
| Acked-by: Alexei Starovoitov <ast@kernel.org> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| net/ipv4/tcp_ipv4.c | 6 +++--- |
| net/ipv6/tcp_ipv6.c | 6 +++--- |
| 2 files changed, 6 insertions(+), 6 deletions(-) |
| |
| --- a/net/ipv4/tcp_ipv4.c |
| +++ b/net/ipv4/tcp_ipv4.c |
| @@ -1722,9 +1722,9 @@ process: |
| */ |
| sock_hold(sk); |
| refcounted = true; |
| - if (tcp_filter(sk, skb)) |
| - goto discard_and_relse; |
| - nsk = tcp_check_req(sk, skb, req, false); |
| + nsk = NULL; |
| + if (!tcp_filter(sk, skb)) |
| + nsk = tcp_check_req(sk, skb, req, false); |
| if (!nsk) { |
| reqsk_put(req); |
| goto discard_and_relse; |
| --- a/net/ipv6/tcp_ipv6.c |
| +++ b/net/ipv6/tcp_ipv6.c |
| @@ -1456,9 +1456,9 @@ process: |
| } |
| sock_hold(sk); |
| refcounted = true; |
| - if (tcp_filter(sk, skb)) |
| - goto discard_and_relse; |
| - nsk = tcp_check_req(sk, skb, req, false); |
| + nsk = NULL; |
| + if (!tcp_filter(sk, skb)) |
| + nsk = tcp_check_req(sk, skb, req, false); |
| if (!nsk) { |
| reqsk_put(req); |
| goto discard_and_relse; |