xfrm: Fix esn sequence number diff calculation in xfrm_replay_notify_esn()
authorMathias Krause <minipli@googlemail.com>
Wed, 20 Mar 2013 21:59:11 +0000 (22:59 +0100)
committerSteffen Klassert <steffen.klassert@secunet.com>
Mon, 25 Mar 2013 06:25:50 +0000 (07:25 +0100)
Commit 0017c0b "xfrm: Fix replay notification for esn." is off by one
for the sequence number wrapped case as UINT_MAX is 0xffffffff, not
0x100000000. ;)

Just calculate the diff like done everywhere else in the file.

Signed-off-by: Mathias Krause <minipli@googlemail.com>
Signed-off-by: Steffen Klassert <steffen.klassert@secunet.com>
net/xfrm/xfrm_replay.c

index a390673..8dafe6d 100644 (file)
@@ -359,14 +359,12 @@ static void xfrm_replay_notify_esn(struct xfrm_state *x, int event)
                if (replay_esn->seq_hi == preplay_esn->seq_hi)
                        seq_diff = replay_esn->seq - preplay_esn->seq;
                else
-                       seq_diff = UINT_MAX - preplay_esn->seq
-                                  + replay_esn->seq;
+                       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 = UINT_MAX - preplay_esn->oseq
-                                   + replay_esn->oseq;
+                       oseq_diff = ~preplay_esn->oseq + replay_esn->oseq + 1;
 
                if (seq_diff < x->replay_maxdiff &&
                    oseq_diff < x->replay_maxdiff) {