diff options
Diffstat (limited to 'net/xfrm/xfrm_replay.c')
| -rw-r--r-- | net/xfrm/xfrm_replay.c | 54 | 
1 files changed, 28 insertions, 26 deletions
diff --git a/net/xfrm/xfrm_replay.c b/net/xfrm/xfrm_replay.c index 8dafe6d3c6e4..dab57daae408 100644 --- a/net/xfrm/xfrm_replay.c +++ b/net/xfrm/xfrm_replay.c @@ -61,9 +61,9 @@ static void xfrm_replay_notify(struct xfrm_state *x, int event)  	switch (event) {  	case XFRM_REPLAY_UPDATE: -		if (x->replay_maxdiff && -		    (x->replay.seq - x->preplay.seq < x->replay_maxdiff) && -		    (x->replay.oseq - x->preplay.oseq < x->replay_maxdiff)) { +		if (!x->replay_maxdiff || +		    ((x->replay.seq - x->preplay.seq < x->replay_maxdiff) && +		    (x->replay.oseq - x->preplay.oseq < x->replay_maxdiff))) {  			if (x->xflags & XFRM_TIME_DEFER)  				event = XFRM_REPLAY_TIMEOUT;  			else @@ -129,8 +129,7 @@ static int xfrm_replay_check(struct xfrm_state *x,  		return 0;  	diff = x->replay.seq - seq; -	if (diff >= min_t(unsigned int, x->props.replay_window, -			  sizeof(x->replay.bitmap) * 8)) { +	if (diff >= x->props.replay_window) {  		x->stats.replay_window++;  		goto err;  	} @@ -302,9 +301,10 @@ static void xfrm_replay_notify_bmp(struct xfrm_state *x, int event)  	switch (event) {  	case XFRM_REPLAY_UPDATE: -		if (x->replay_maxdiff && -		    (replay_esn->seq - preplay_esn->seq < x->replay_maxdiff) && -		    (replay_esn->oseq - preplay_esn->oseq < x->replay_maxdiff)) { +		if (!x->replay_maxdiff || +		    ((replay_esn->seq - preplay_esn->seq < x->replay_maxdiff) && +		    (replay_esn->oseq - preplay_esn->oseq +		     < x->replay_maxdiff))) {  			if (x->xflags & XFRM_TIME_DEFER)  				event = XFRM_REPLAY_TIMEOUT;  			else @@ -353,28 +353,30 @@ static void xfrm_replay_notify_esn(struct xfrm_state *x, int event)  	switch (event) {  	case XFRM_REPLAY_UPDATE: -		if (!x->replay_maxdiff) -			break; - -		if (replay_esn->seq_hi == preplay_esn->seq_hi) -			seq_diff = replay_esn->seq - preplay_esn->seq; -		else -			seq_diff = ~preplay_esn->seq + replay_esn->seq + 1; - -		if (replay_esn->oseq_hi == preplay_esn->oseq_hi) -			oseq_diff = replay_esn->oseq - preplay_esn->oseq; -		else -			oseq_diff = ~preplay_esn->oseq + replay_esn->oseq + 1; - -		if (seq_diff < x->replay_maxdiff && -		    oseq_diff < x->replay_maxdiff) { +		if (x->replay_maxdiff) { +			if (replay_esn->seq_hi == preplay_esn->seq_hi) +				seq_diff = replay_esn->seq - preplay_esn->seq; +			else +				seq_diff = ~preplay_esn->seq + replay_esn->seq +					   + 1; -			if (x->xflags & XFRM_TIME_DEFER) -				event = XFRM_REPLAY_TIMEOUT; +			if (replay_esn->oseq_hi == preplay_esn->oseq_hi) +				oseq_diff = replay_esn->oseq +					    - preplay_esn->oseq;  			else -				return; +				oseq_diff = ~preplay_esn->oseq +					    + replay_esn->oseq + 1; + +			if (seq_diff >= x->replay_maxdiff || +			    oseq_diff >= x->replay_maxdiff) +				break;  		} +		if (x->xflags & XFRM_TIME_DEFER) +			event = XFRM_REPLAY_TIMEOUT; +		else +			return; +  		break;  	case XFRM_REPLAY_TIMEOUT:  |