From: Tao Cui <[email protected]>

The userspace PM increments extra_subflows after __mptcp_subflow_connect()
succeeds, but __mptcp_subflow_connect() calls mptcp_pm_close_subflow()
on failure to roll back the pre-increment done by the kernel PM's fill_*()
helpers. Because the userspace PM hasn't incremented yet at that point,
this decrement is spurious and causes extra_subflows to underflow.

Fix it by aligning the userspace PM with the kernel PM: increment
extra_subflows before calling __mptcp_subflow_connect(), so the existing
error path in subflow.c correctly rolls it back on failure. Also simplify
the error handling by taking pm.lock only when needed for cleanup.

Fixes: 77e4b94a3de6 ("mptcp: update userspace pm infos")
Cc: [email protected]
Signed-off-by: Tao Cui <[email protected]>
Reviewed-by: Matthieu Baerts (NGI0) <[email protected]>
Signed-off-by: Matthieu Baerts (NGI0) <[email protected]>
---
 net/mptcp/pm_userspace.c | 14 ++++++++------
 1 file changed, 8 insertions(+), 6 deletions(-)

diff --git a/net/mptcp/pm_userspace.c b/net/mptcp/pm_userspace.c
index 8cbc1920afb4..0d3a95e676f1 100644
--- a/net/mptcp/pm_userspace.c
+++ b/net/mptcp/pm_userspace.c
@@ -408,19 +408,21 @@ int mptcp_pm_nl_subflow_create_doit(struct sk_buff *skb, 
struct genl_info *info)
        local.flags = entry.flags;
        local.ifindex = entry.ifindex;
 
+       spin_lock_bh(&msk->pm.lock);
+       msk->pm.extra_subflows++;
+       spin_unlock_bh(&msk->pm.lock);
+
        lock_sock(sk);
        err = __mptcp_subflow_connect(sk, &local, &addr_r);
        release_sock(sk);
 
-       if (err)
+       if (err) {
                GENL_SET_ERR_MSG_FMT(info, "connect error: %d", err);
 
-       spin_lock_bh(&msk->pm.lock);
-       if (err)
+               spin_lock_bh(&msk->pm.lock);
                mptcp_userspace_pm_delete_local_addr(msk, &entry);
-       else
-               msk->pm.extra_subflows++;
-       spin_unlock_bh(&msk->pm.lock);
+               spin_unlock_bh(&msk->pm.lock);
+       }
 
  create_err:
        sock_put(sk);

-- 
2.53.0


Reply via email to