diff options
Diffstat (limited to 'net/xfrm/xfrm_replay.c')
| -rw-r--r-- | net/xfrm/xfrm_replay.c | 10 | 
1 files changed, 7 insertions, 3 deletions
diff --git a/net/xfrm/xfrm_replay.c b/net/xfrm/xfrm_replay.c index 9277d81b344c..9f4d42eb090f 100644 --- a/net/xfrm/xfrm_replay.c +++ b/net/xfrm/xfrm_replay.c @@ -766,18 +766,22 @@ int xfrm_replay_overflow(struct xfrm_state *x, struct sk_buff *skb)  }  #endif -int xfrm_init_replay(struct xfrm_state *x) +int xfrm_init_replay(struct xfrm_state *x, struct netlink_ext_ack *extack)  {  	struct xfrm_replay_state_esn *replay_esn = x->replay_esn;  	if (replay_esn) {  		if (replay_esn->replay_window > -		    replay_esn->bmp_len * sizeof(__u32) * 8) +		    replay_esn->bmp_len * sizeof(__u32) * 8) { +			NL_SET_ERR_MSG(extack, "ESN replay window is too large for the chosen bitmap size");  			return -EINVAL; +		}  		if (x->props.flags & XFRM_STATE_ESN) { -			if (replay_esn->replay_window == 0) +			if (replay_esn->replay_window == 0) { +				NL_SET_ERR_MSG(extack, "ESN replay window must be > 0");  				return -EINVAL; +			}  			x->repl_mode = XFRM_REPLAY_MODE_ESN;  		} else {  			x->repl_mode = XFRM_REPLAY_MODE_BMP;  |