diff options
Diffstat (limited to 'net/ipv6/tcp_ipv6.c')
| -rw-r--r-- | net/ipv6/tcp_ipv6.c | 14 | 
1 files changed, 9 insertions, 5 deletions
diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c index b9f1fee9a886..73bc8fc68acd 100644 --- a/net/ipv6/tcp_ipv6.c +++ b/net/ipv6/tcp_ipv6.c @@ -101,12 +101,12 @@ static void inet6_sk_rx_dst_set(struct sock *sk, const struct sk_buff *skb)  	}  } -static __u32 tcp_v6_init_sequence(const struct sk_buff *skb) +static u32 tcp_v6_init_sequence(const struct sk_buff *skb, u32 *tsoff)  {  	return secure_tcpv6_sequence_number(ipv6_hdr(skb)->daddr.s6_addr32,  					    ipv6_hdr(skb)->saddr.s6_addr32,  					    tcp_hdr(skb)->dest, -					    tcp_hdr(skb)->source); +					    tcp_hdr(skb)->source, tsoff);  }  static int tcp_v6_connect(struct sock *sk, struct sockaddr *uaddr, @@ -233,6 +233,7 @@ static int tcp_v6_connect(struct sock *sk, struct sockaddr *uaddr,  	fl6.flowi6_mark = sk->sk_mark;  	fl6.fl6_dport = usin->sin6_port;  	fl6.fl6_sport = inet->inet_sport; +	fl6.flowi6_uid = sk->sk_uid;  	opt = rcu_dereference_protected(np->opt, lockdep_sock_is_held(sk));  	final_p = fl6_update_dst(&fl6, opt, &final); @@ -282,7 +283,8 @@ static int tcp_v6_connect(struct sock *sk, struct sockaddr *uaddr,  		tp->write_seq = secure_tcpv6_sequence_number(np->saddr.s6_addr32,  							     sk->sk_v6_daddr.s6_addr32,  							     inet->inet_sport, -							     inet->inet_dport); +							     inet->inet_dport, +							     &tp->tsoffset);  	err = tcp_connect(sk);  	if (err) @@ -397,7 +399,7 @@ static void tcp_v6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,  		if (!sock_owned_by_user(sk))  			tcp_v6_mtu_reduced(sk);  		else if (!test_and_set_bit(TCP_MTU_REDUCED_DEFERRED, -					   &tp->tsq_flags)) +					   &sk->sk_tsq_flags))  			sock_hold(sk);  		goto out;  	} @@ -828,6 +830,7 @@ static void tcp_v6_send_response(const struct sock *sk, struct sk_buff *skb, u32  	fl6.flowi6_mark = IP6_REPLY_MARK(net, skb->mark);  	fl6.fl6_dport = t1->dest;  	fl6.fl6_sport = t1->source; +	fl6.flowi6_uid = sock_net_uid(net, sk && sk_fullsock(sk) ? sk : NULL);  	security_skb_classify_flow(skb, flowi6_to_flowi(&fl6));  	/* Pass a socket to ip6_dst_lookup either it is for RST @@ -954,7 +957,8 @@ static void tcp_v6_reqsk_send_ack(const struct sock *sk, struct sk_buff *skb,  			tcp_rsk(req)->snt_isn + 1 : tcp_sk(sk)->snd_nxt,  			tcp_rsk(req)->rcv_nxt,  			req->rsk_rcv_wnd >> inet_rsk(req)->rcv_wscale, -			tcp_time_stamp, req->ts_recent, sk->sk_bound_dev_if, +			tcp_time_stamp + tcp_rsk(req)->ts_off, +			req->ts_recent, sk->sk_bound_dev_if,  			tcp_v6_md5_do_lookup(sk, &ipv6_hdr(skb)->daddr),  			0, 0);  }  |