mptcp: fix opt size when sending DSS + MP_FAIL
authorMatthieu Baerts <matthieu.baerts@tessares.net>
Thu, 6 Jan 2022 22:06:36 +0000 (14:06 -0800)
committerDavid S. Miller <davem@davemloft.net>
Fri, 7 Jan 2022 11:29:45 +0000 (11:29 +0000)
When these two options had to be sent -- which is not common -- the DSS
size was not being taken into account in the remaining size.

Additionally in this situation, the reported size was only the one of
the MP_FAIL which can cause issue if at the end, we need to write more
in the TCP options than previously said.

Here we use a dedicated variable for MP_FAIL size to keep the
WARN_ON_ONCE() just after.

Fixes: c25aeb4e0953 ("mptcp: MP_FAIL suboption sending")
Acked-and-tested-by: Geliang Tang <geliang.tang@suse.com>
Signed-off-by: Matthieu Baerts <matthieu.baerts@tessares.net>
Signed-off-by: Mat Martineau <mathew.j.martineau@linux.intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/mptcp/options.c

index fe98e4f475baa4bcc0fb814be3bf1d74575f13e1..96c6efdd48bccd01cabe95678f7b0d9deaa62ec4 100644 (file)
@@ -821,10 +821,13 @@ bool mptcp_established_options(struct sock *sk, struct sk_buff *skb,
        if (mptcp_established_options_mp(sk, skb, snd_data_fin, &opt_size, remaining, opts))
                ret = true;
        else if (mptcp_established_options_dss(sk, skb, snd_data_fin, &opt_size, remaining, opts)) {
+               unsigned int mp_fail_size;
+
                ret = true;
-               if (mptcp_established_options_mp_fail(sk, &opt_size, remaining, opts)) {
-                       *size += opt_size;
-                       remaining -= opt_size;
+               if (mptcp_established_options_mp_fail(sk, &mp_fail_size,
+                                                     remaining - opt_size, opts)) {
+                       *size += opt_size + mp_fail_size;
+                       remaining -= opt_size - mp_fail_size;
                        return true;
                }
        }