mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-30 19:06:14 +00:00
xfrm: Check for esn buffer len in xfrm_new_ae
In xfrm_new_ae() we may overwrite the allocated esn replay state buffer with a wrong size. So check that the new size matches the original allocated size and return an error if this is not the case. Signed-off-by: Steffen Klassert <steffen.klassert@secunet.com> Acked-by: Herbert Xu <herbert@gondor.apana.org.au> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
af2f464e32
commit
e2b19125e9
1 changed files with 21 additions and 0 deletions
|
@ -360,6 +360,23 @@ static int attach_aead(struct xfrm_algo_aead **algpp, u8 *props,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline int xfrm_replay_verify_len(struct xfrm_replay_state_esn *replay_esn,
|
||||||
|
struct nlattr *rp)
|
||||||
|
{
|
||||||
|
struct xfrm_replay_state_esn *up;
|
||||||
|
|
||||||
|
if (!replay_esn || !rp)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
up = nla_data(rp);
|
||||||
|
|
||||||
|
if (xfrm_replay_state_esn_len(replay_esn) !=
|
||||||
|
xfrm_replay_state_esn_len(up))
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int xfrm_alloc_replay_state_esn(struct xfrm_replay_state_esn **replay_esn,
|
static int xfrm_alloc_replay_state_esn(struct xfrm_replay_state_esn **replay_esn,
|
||||||
struct xfrm_replay_state_esn **preplay_esn,
|
struct xfrm_replay_state_esn **preplay_esn,
|
||||||
struct nlattr *rta)
|
struct nlattr *rta)
|
||||||
|
@ -1766,6 +1783,10 @@ static int xfrm_new_ae(struct sk_buff *skb, struct nlmsghdr *nlh,
|
||||||
if (x->km.state != XFRM_STATE_VALID)
|
if (x->km.state != XFRM_STATE_VALID)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
|
err = xfrm_replay_verify_len(x->replay_esn, rp);
|
||||||
|
if (err)
|
||||||
|
goto out;
|
||||||
|
|
||||||
spin_lock_bh(&x->lock);
|
spin_lock_bh(&x->lock);
|
||||||
xfrm_update_ae_params(x, attrs);
|
xfrm_update_ae_params(x, attrs);
|
||||||
spin_unlock_bh(&x->lock);
|
spin_unlock_bh(&x->lock);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue