浏览代码

tcp: Get a proper dst before checking it.

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>
Tonghao Zhang 8 年之前
父节点
当前提交
49c71586a6
共有 1 个文件被更改,包括 4 次插入5 次删除
  1. 4 5
      net/ipv4/tcp_input.c

+ 4 - 5
net/ipv4/tcp_input.c

@@ -6111,6 +6111,10 @@ int tcp_conn_request(struct request_sock_ops *rsk_ops,
 	if (tmp_opt.tstamp_ok)
 	if (tmp_opt.tstamp_ok)
 		tcp_rsk(req)->ts_off = af_ops->init_ts_off(net, skb);
 		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) {
 	if (!want_cookie && !isn) {
 		/* Kill the following clause, if you dislike this way. */
 		/* Kill the following clause, if you dislike this way. */
 		if (!net->ipv4.sysctl_tcp_syncookies &&
 		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);
 		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);
 	tcp_ecn_create_request(req, skb, sk, dst);