]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
mptcp: check userspace pm flags
authorGeliang Tang <tanggeliang@kylinos.cn>
Fri, 1 Mar 2024 18:18:30 +0000 (19:18 +0100)
committerDavid S. Miller <davem@davemloft.net>
Mon, 4 Mar 2024 13:07:45 +0000 (13:07 +0000)
Just like MPTCP_PM_ADDR_FLAG_SIGNAL flag is checked in userspace PM
announce mptcp_pm_nl_announce_doit(), PM flags should be checked in
mptcp_pm_nl_subflow_create_doit() too.

If MPTCP_PM_ADDR_FLAG_SUBFLOW flag is not set, there's no flags field
in the output of dump_addr. This looks a bit strange:

        id 10 flags  10.0.3.2

This patch uses mptcp_pm_parse_entry() instead of mptcp_pm_parse_addr()
to get the PM flags of the entry and check it. MPTCP_PM_ADDR_FLAG_SIGNAL
flag shouldn't be set here, and if MPTCP_PM_ADDR_FLAG_SUBFLOW flag is
missing from the netlink attribute, always set this flag.

Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
Reviewed-by: Matthieu Baerts (NGI0) <matttbe@kernel.org>
Reviewed-by: Mat Martineau <martineau@kernel.org>
Signed-off-by: Matthieu Baerts (NGI0) <matttbe@kernel.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/mptcp/pm_userspace.c

index d6b7be3afbe5135c199b5e04e92235aaca4dfa32..3bd13e94b5687ac086d456ce22dbbf564b72d202 100644 (file)
@@ -334,7 +334,6 @@ int mptcp_pm_nl_subflow_create_doit(struct sk_buff *skb, struct genl_info *info)
        struct nlattr *laddr = info->attrs[MPTCP_PM_ATTR_ADDR];
        struct mptcp_pm_addr_entry local = { 0 };
        struct mptcp_addr_info addr_r;
-       struct mptcp_addr_info addr_l;
        struct mptcp_sock *msk;
        int err = -EINVAL;
        struct sock *sk;
@@ -360,25 +359,31 @@ int mptcp_pm_nl_subflow_create_doit(struct sk_buff *skb, struct genl_info *info)
                goto create_err;
        }
 
-       err = mptcp_pm_parse_addr(laddr, info, &addr_l);
+       err = mptcp_pm_parse_entry(laddr, info, true, &local);
        if (err < 0) {
                NL_SET_ERR_MSG_ATTR(info->extack, laddr, "error parsing local addr");
                goto create_err;
        }
 
+       if (local.flags & MPTCP_PM_ADDR_FLAG_SIGNAL) {
+               GENL_SET_ERR_MSG(info, "invalid addr flags");
+               err = -EINVAL;
+               goto create_err;
+       }
+       local.flags |= MPTCP_PM_ADDR_FLAG_SUBFLOW;
+
        err = mptcp_pm_parse_addr(raddr, info, &addr_r);
        if (err < 0) {
                NL_SET_ERR_MSG_ATTR(info->extack, raddr, "error parsing remote addr");
                goto create_err;
        }
 
-       if (!mptcp_pm_addr_families_match(sk, &addr_l, &addr_r)) {
+       if (!mptcp_pm_addr_families_match(sk, &local.addr, &addr_r)) {
                GENL_SET_ERR_MSG(info, "families mismatch");
                err = -EINVAL;
                goto create_err;
        }
 
-       local.addr = addr_l;
        err = mptcp_userspace_pm_append_new_local_addr(msk, &local, false);
        if (err < 0) {
                GENL_SET_ERR_MSG(info, "did not match address and id");
@@ -387,7 +392,7 @@ int mptcp_pm_nl_subflow_create_doit(struct sk_buff *skb, struct genl_info *info)
 
        lock_sock(sk);
 
-       err = __mptcp_subflow_connect(sk, &addr_l, &addr_r);
+       err = __mptcp_subflow_connect(sk, &local.addr, &addr_r);
 
        release_sock(sk);