tcp: Get a proper dst before checking it.
authorTonghao Zhang <xiangxia.m.yue@gmail.com>
Tue, 22 Aug 2017 06:33:48 +0000 (23:33 -0700)
committerDavid S. Miller <davem@davemloft.net>
Tue, 22 Aug 2017 21:16:12 +0000 (14:16 -0700)
tcp_peer_is_proven needs a proper route to make the
determination, but dst always is NULL. This bug may
be there at the beginning of git tree. This does not
look serious enough to deserve backports to stable
versions.

Signed-off-by: Tonghao Zhang <xiangxia.m.yue@gmail.com>
Acked-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/ipv4/tcp_input.c

index ddc854728a6011cc36d82ef0e226c0fbbbec339d..ab908949ee95b55a124ec101523b9a3edf37381b 100644 (file)
@@ -6111,6 +6111,10 @@ int tcp_conn_request(struct request_sock_ops *rsk_ops,
        if (tmp_opt.tstamp_ok)
                tcp_rsk(req)->ts_off = af_ops->init_ts_off(net, skb);
 
+       dst = af_ops->route_req(sk, &fl, req);
+       if (!dst)
+               goto drop_and_free;
+
        if (!want_cookie && !isn) {
                /* Kill the following clause, if you dislike this way. */
                if (!net->ipv4.sysctl_tcp_syncookies &&
@@ -6131,11 +6135,6 @@ int tcp_conn_request(struct request_sock_ops *rsk_ops,
 
                isn = af_ops->init_seq(skb);
        }
-       if (!dst) {
-               dst = af_ops->route_req(sk, &fl, req);
-               if (!dst)
-                       goto drop_and_free;
-       }
 
        tcp_ecn_create_request(req, skb, sk, dst);