diff options
Diffstat (limited to 'net/xfrm/xfrm_user.c')
| -rw-r--r-- | net/xfrm/xfrm_user.c | 40 | 
1 files changed, 31 insertions, 9 deletions
| diff --git a/net/xfrm/xfrm_user.c b/net/xfrm/xfrm_user.c index 2091664295ba..bd16c6c7e1e7 100644 --- a/net/xfrm/xfrm_user.c +++ b/net/xfrm/xfrm_user.c @@ -289,6 +289,31 @@ static int attach_one_algo(struct xfrm_algo **algpp, u8 *props,  	return 0;  } +static int attach_crypt(struct xfrm_state *x, struct nlattr *rta) +{ +	struct xfrm_algo *p, *ualg; +	struct xfrm_algo_desc *algo; + +	if (!rta) +		return 0; + +	ualg = nla_data(rta); + +	algo = xfrm_ealg_get_byname(ualg->alg_name, 1); +	if (!algo) +		return -ENOSYS; +	x->props.ealgo = algo->desc.sadb_alg_id; + +	p = kmemdup(ualg, xfrm_alg_len(ualg), GFP_KERNEL); +	if (!p) +		return -ENOMEM; + +	strcpy(p->alg_name, algo->name); +	x->ealg = p; +	x->geniv = algo->uinfo.encr.geniv; +	return 0; +} +  static int attach_auth(struct xfrm_algo_auth **algpp, u8 *props,  		       struct nlattr *rta)  { @@ -349,8 +374,7 @@ static int attach_auth_trunc(struct xfrm_algo_auth **algpp, u8 *props,  	return 0;  } -static int attach_aead(struct xfrm_algo_aead **algpp, u8 *props, -		       struct nlattr *rta) +static int attach_aead(struct xfrm_state *x, struct nlattr *rta)  {  	struct xfrm_algo_aead *p, *ualg;  	struct xfrm_algo_desc *algo; @@ -363,14 +387,15 @@ static int attach_aead(struct xfrm_algo_aead **algpp, u8 *props,  	algo = xfrm_aead_get_byname(ualg->alg_name, ualg->alg_icv_len, 1);  	if (!algo)  		return -ENOSYS; -	*props = algo->desc.sadb_alg_id; +	x->props.ealgo = algo->desc.sadb_alg_id;  	p = kmemdup(ualg, aead_len(ualg), GFP_KERNEL);  	if (!p)  		return -ENOMEM;  	strcpy(p->alg_name, algo->name); -	*algpp = p; +	x->aead = p; +	x->geniv = algo->uinfo.aead.geniv;  	return 0;  } @@ -515,8 +540,7 @@ static struct xfrm_state *xfrm_state_construct(struct net *net,  	if (attrs[XFRMA_SA_EXTRA_FLAGS])  		x->props.extra_flags = nla_get_u32(attrs[XFRMA_SA_EXTRA_FLAGS]); -	if ((err = attach_aead(&x->aead, &x->props.ealgo, -			       attrs[XFRMA_ALG_AEAD]))) +	if ((err = attach_aead(x, attrs[XFRMA_ALG_AEAD])))  		goto error;  	if ((err = attach_auth_trunc(&x->aalg, &x->props.aalgo,  				     attrs[XFRMA_ALG_AUTH_TRUNC]))) @@ -526,9 +550,7 @@ static struct xfrm_state *xfrm_state_construct(struct net *net,  				       attrs[XFRMA_ALG_AUTH])))  			goto error;  	} -	if ((err = attach_one_algo(&x->ealg, &x->props.ealgo, -				   xfrm_ealg_get_byname, -				   attrs[XFRMA_ALG_CRYPT]))) +	if ((err = attach_crypt(x, attrs[XFRMA_ALG_CRYPT])))  		goto error;  	if ((err = attach_one_algo(&x->calg, &x->props.calgo,  				   xfrm_calg_get_byname, |