diff options
Diffstat (limited to 'net/ipv4/cipso_ipv4.c')
| -rw-r--r-- | net/ipv4/cipso_ipv4.c | 24 | 
1 files changed, 7 insertions, 17 deletions
| diff --git a/net/ipv4/cipso_ipv4.c b/net/ipv4/cipso_ipv4.c index 2ae8f54cb321..82178cc69c96 100644 --- a/net/ipv4/cipso_ipv4.c +++ b/net/ipv4/cipso_ipv4.c @@ -1951,7 +1951,7 @@ int cipso_v4_req_setattr(struct request_sock *req,  	buf = NULL;  	req_inet = inet_rsk(req); -	opt = xchg(&req_inet->opt, opt); +	opt = xchg((__force struct ip_options_rcu **)&req_inet->ireq_opt, opt);  	if (opt)  		kfree_rcu(opt, rcu); @@ -1973,11 +1973,13 @@ req_setattr_failure:   * values on failure.   *   */ -static int cipso_v4_delopt(struct ip_options_rcu **opt_ptr) +static int cipso_v4_delopt(struct ip_options_rcu __rcu **opt_ptr)  { +	struct ip_options_rcu *opt = rcu_dereference_protected(*opt_ptr, 1);  	int hdr_delta = 0; -	struct ip_options_rcu *opt = *opt_ptr; +	if (!opt || opt->opt.cipso == 0) +		return 0;  	if (opt->opt.srr || opt->opt.rr || opt->opt.ts || opt->opt.router_alert) {  		u8 cipso_len;  		u8 cipso_off; @@ -2039,14 +2041,10 @@ static int cipso_v4_delopt(struct ip_options_rcu **opt_ptr)   */  void cipso_v4_sock_delattr(struct sock *sk)  { -	int hdr_delta; -	struct ip_options_rcu *opt;  	struct inet_sock *sk_inet; +	int hdr_delta;  	sk_inet = inet_sk(sk); -	opt = rcu_dereference_protected(sk_inet->inet_opt, 1); -	if (!opt || opt->opt.cipso == 0) -		return;  	hdr_delta = cipso_v4_delopt(&sk_inet->inet_opt);  	if (sk_inet->is_icsk && hdr_delta > 0) { @@ -2066,15 +2064,7 @@ void cipso_v4_sock_delattr(struct sock *sk)   */  void cipso_v4_req_delattr(struct request_sock *req)  { -	struct ip_options_rcu *opt; -	struct inet_request_sock *req_inet; - -	req_inet = inet_rsk(req); -	opt = req_inet->opt; -	if (!opt || opt->opt.cipso == 0) -		return; - -	cipso_v4_delopt(&req_inet->opt); +	cipso_v4_delopt(&inet_rsk(req)->ireq_opt);  }  /** |