diff options
author | Takashi Iwai <tiwai@suse.de> | 2011-04-05 09:12:21 +0200 |
---|---|---|
committer | Takashi Iwai <tiwai@suse.de> | 2011-04-05 09:12:21 +0200 |
commit | 4e29402fe4b2006c994eed5020c42b2cc87d9b42 (patch) | |
tree | c0229c107045ab21487729f6a6cab6b70ed30bfa /net/xfrm/xfrm_user.c | |
parent | f8852b12200df393b0a4db1a7052454bbc335443 (diff) | |
parent | 00b317a41c5428b13eb7e5b4bbc691b1aa7afa80 (diff) | |
download | op-kernel-dev-4e29402fe4b2006c994eed5020c42b2cc87d9b42.zip op-kernel-dev-4e29402fe4b2006c994eed5020c42b2cc87d9b42.tar.gz |
Merge branch 'for-2.6.39' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound-2.6 into fix/asoc
Diffstat (limited to 'net/xfrm/xfrm_user.c')
-rw-r--r-- | net/xfrm/xfrm_user.c | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/net/xfrm/xfrm_user.c b/net/xfrm/xfrm_user.c index fc152d28..3d15d3e 100644 --- a/net/xfrm/xfrm_user.c +++ b/net/xfrm/xfrm_user.c @@ -127,6 +127,9 @@ static inline int verify_replay(struct xfrm_usersa_info *p, if (!rt) return 0; + if (p->id.proto != IPPROTO_ESP) + return -EINVAL; + if (p->replay_window != 0) return -EINVAL; @@ -360,6 +363,23 @@ static int attach_aead(struct xfrm_algo_aead **algpp, u8 *props, 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, struct xfrm_replay_state_esn **preplay_esn, struct nlattr *rta) @@ -1766,6 +1786,10 @@ static int xfrm_new_ae(struct sk_buff *skb, struct nlmsghdr *nlh, if (x->km.state != XFRM_STATE_VALID) goto out; + err = xfrm_replay_verify_len(x->replay_esn, rp); + if (err) + goto out; + spin_lock_bh(&x->lock); xfrm_update_ae_params(x, attrs); spin_unlock_bh(&x->lock); |