xfrm: add extack to verify_sec_ctx_len
authorSabrina Dubroca <sd@queasysnail.net>
Tue, 30 Aug 2022 14:23:12 +0000 (16:23 +0200)
committerSteffen Klassert <steffen.klassert@secunet.com>
Wed, 31 Aug 2022 09:25:58 +0000 (11:25 +0200)
Signed-off-by: Sabrina Dubroca <sd@queasysnail.net>
Signed-off-by: Steffen Klassert <steffen.klassert@secunet.com>
net/xfrm/xfrm_user.c

index 9fd30914f1ff5a5ee1554317aa768373c0d5bc6c..772a051feedb2b2d41911c774db037d9e7064861 100644 (file)
@@ -102,7 +102,7 @@ static void verify_one_addr(struct nlattr **attrs, enum xfrm_attr_type_t type,
                *addrp = nla_data(rt);
 }
 
-static inline int verify_sec_ctx_len(struct nlattr **attrs)
+static inline int verify_sec_ctx_len(struct nlattr **attrs, struct netlink_ext_ack *extack)
 {
        struct nlattr *rt = attrs[XFRMA_SEC_CTX];
        struct xfrm_user_sec_ctx *uctx;
@@ -112,8 +112,10 @@ static inline int verify_sec_ctx_len(struct nlattr **attrs)
 
        uctx = nla_data(rt);
        if (uctx->len > nla_len(rt) ||
-           uctx->len != (sizeof(struct xfrm_user_sec_ctx) + uctx->ctx_len))
+           uctx->len != (sizeof(struct xfrm_user_sec_ctx) + uctx->ctx_len)) {
+               NL_SET_ERR_MSG(extack, "Invalid security context length");
                return -EINVAL;
+       }
 
        return 0;
 }
@@ -264,7 +266,7 @@ static int verify_newsa_info(struct xfrm_usersa_info *p,
                goto out;
        if ((err = verify_one_alg(attrs, XFRMA_ALG_COMP)))
                goto out;
-       if ((err = verify_sec_ctx_len(attrs)))
+       if ((err = verify_sec_ctx_len(attrs, NULL)))
                goto out;
        if ((err = verify_replay(p, attrs)))
                goto out;
@@ -1800,7 +1802,7 @@ static int xfrm_add_policy(struct sk_buff *skb, struct nlmsghdr *nlh,
        err = verify_newpolicy_info(p, extack);
        if (err)
                return err;
-       err = verify_sec_ctx_len(attrs);
+       err = verify_sec_ctx_len(attrs, extack);
        if (err)
                return err;
 
@@ -2136,7 +2138,7 @@ static int xfrm_get_policy(struct sk_buff *skb, struct nlmsghdr *nlh,
                struct nlattr *rt = attrs[XFRMA_SEC_CTX];
                struct xfrm_sec_ctx *ctx;
 
-               err = verify_sec_ctx_len(attrs);
+               err = verify_sec_ctx_len(attrs, extack);
                if (err)
                        return err;
 
@@ -2441,7 +2443,7 @@ static int xfrm_add_pol_expire(struct sk_buff *skb, struct nlmsghdr *nlh,
                struct nlattr *rt = attrs[XFRMA_SEC_CTX];
                struct xfrm_sec_ctx *ctx;
 
-               err = verify_sec_ctx_len(attrs);
+               err = verify_sec_ctx_len(attrs, extack);
                if (err)
                        return err;
 
@@ -2533,7 +2535,7 @@ static int xfrm_add_acquire(struct sk_buff *skb, struct nlmsghdr *nlh,
        err = verify_newpolicy_info(&ua->policy, extack);
        if (err)
                goto free_state;
-       err = verify_sec_ctx_len(attrs);
+       err = verify_sec_ctx_len(attrs, extack);
        if (err)
                goto free_state;