]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
xfrm: prevent high SEQ input in non-ESN mode
authorLeon Romanovsky <leonro@nvidia.com>
Wed, 5 Feb 2025 18:27:49 +0000 (20:27 +0200)
committerSteffen Klassert <steffen.klassert@secunet.com>
Wed, 12 Feb 2025 12:00:27 +0000 (13:00 +0100)
In non-ESN mode, the SEQ numbers are limited to 32 bits and seq_hi/oseq_hi
are not used. So make sure that user gets proper error message, in case
such assignment occurred.

Signed-off-by: Leon Romanovsky <leonro@nvidia.com>
Signed-off-by: Steffen Klassert <steffen.klassert@secunet.com>
net/xfrm/xfrm_user.c

index 08c6d6f0179fbf4753b7d2ee39bd45228baa9b55..5877eabe9d958e32bcebcc80d50efdffc0f5513c 100644 (file)
@@ -178,6 +178,12 @@ static inline int verify_replay(struct xfrm_usersa_info *p,
                                       "Replay seq and seq_hi should be 0 for output SA");
                        return -EINVAL;
                }
+               if (rs->oseq_hi && !(p->flags & XFRM_STATE_ESN)) {
+                       NL_SET_ERR_MSG(
+                               extack,
+                               "Replay oseq_hi should be 0 in non-ESN mode for output SA");
+                       return -EINVAL;
+               }
                if (rs->bmp_len) {
                        NL_SET_ERR_MSG(extack, "Replay bmp_len should 0 for output SA");
                        return -EINVAL;
@@ -190,6 +196,12 @@ static inline int verify_replay(struct xfrm_usersa_info *p,
                                       "Replay oseq and oseq_hi should be 0 for input SA");
                        return -EINVAL;
                }
+               if (rs->seq_hi && !(p->flags & XFRM_STATE_ESN)) {
+                       NL_SET_ERR_MSG(
+                               extack,
+                               "Replay seq_hi should be 0 in non-ESN mode for input SA");
+                       return -EINVAL;
+               }
        }
 
        return 0;