diff options
Diffstat (limited to 'net/xfrm/xfrm_user.c')
| -rw-r--r-- | net/xfrm/xfrm_user.c | 22 | 
1 files changed, 10 insertions, 12 deletions
diff --git a/net/xfrm/xfrm_user.c b/net/xfrm/xfrm_user.c index d516845e16e3..08892091cfe3 100644 --- a/net/xfrm/xfrm_user.c +++ b/net/xfrm/xfrm_user.c @@ -581,9 +581,12 @@ static struct xfrm_state *xfrm_state_construct(struct net *net,  	if (err)  		goto error; -	if (attrs[XFRMA_SEC_CTX] && -	    security_xfrm_state_alloc(x, nla_data(attrs[XFRMA_SEC_CTX]))) -		goto error; +	if (attrs[XFRMA_SEC_CTX]) { +		err = security_xfrm_state_alloc(x, +						nla_data(attrs[XFRMA_SEC_CTX])); +		if (err) +			goto error; +	}  	if ((err = xfrm_alloc_replay_state_esn(&x->replay_esn, &x->preplay_esn,  					       attrs[XFRMA_REPLAY_ESN_VAL]))) @@ -896,7 +899,8 @@ static int xfrm_dump_sa_done(struct netlink_callback *cb)  	struct sock *sk = cb->skb->sk;  	struct net *net = sock_net(sk); -	xfrm_state_walk_done(walk, net); +	if (cb->args[0]) +		xfrm_state_walk_done(walk, net);  	return 0;  } @@ -921,8 +925,6 @@ static int xfrm_dump_sa(struct sk_buff *skb, struct netlink_callback *cb)  		u8 proto = 0;  		int err; -		cb->args[0] = 1; -  		err = nlmsg_parse(cb->nlh, 0, attrs, XFRMA_MAX,  				  xfrma_policy);  		if (err < 0) @@ -939,6 +941,7 @@ static int xfrm_dump_sa(struct sk_buff *skb, struct netlink_callback *cb)  			proto = nla_get_u8(attrs[XFRMA_PROTO]);  		xfrm_state_walk_init(walk, proto, filter); +		cb->args[0] = 1;  	}  	(void) xfrm_state_walk(net, walk, dump_one_state, &info); @@ -2051,9 +2054,6 @@ static int xfrm_add_pol_expire(struct sk_buff *skb, struct nlmsghdr *nlh,  	if (up->hard) {  		xfrm_policy_delete(xp, p->dir);  		xfrm_audit_policy_delete(xp, 1, true); -	} else { -		// reset the timers here? -		WARN(1, "Don't know what to do with soft policy expire\n");  	}  	km_policy_expired(xp, p->dir, up->hard, nlh->nlmsg_pid); @@ -2117,7 +2117,7 @@ static int xfrm_add_acquire(struct sk_buff *skb, struct nlmsghdr *nlh,  	err = verify_newpolicy_info(&ua->policy);  	if (err) -		goto bad_policy; +		goto free_state;  	/*   build an XP */  	xp = xfrm_policy_construct(net, &ua->policy, attrs, &err); @@ -2149,8 +2149,6 @@ static int xfrm_add_acquire(struct sk_buff *skb, struct nlmsghdr *nlh,  	return 0; -bad_policy: -	WARN(1, "BAD policy passed\n");  free_state:  	kfree(x);  nomem:  | 
