Since we allow the option lengths that include the port field we should correctly parse the field if present. squashto: Add ADD_ADDR handling Signed-off-by: Peter Krystad --- include/linux/tcp.h | 1 + net/mptcp/options.c | 11 +++++++++++ 2 files changed, 12 insertions(+) diff --git a/include/linux/tcp.h b/include/linux/tcp.h index 41e5a0e3622f..1225db308957 100644 --- a/include/linux/tcp.h +++ b/include/linux/tcp.h @@ -109,6 +109,7 @@ struct mptcp_options_received { #endif }; u64 ahmac; + u16 port; }; #endif diff --git a/net/mptcp/options.c b/net/mptcp/options.c index 9b90bdc419ac..d9e0d82fd1b9 100644 --- a/net/mptcp/options.c +++ b/net/mptcp/options.c @@ -205,16 +205,27 @@ void mptcp_parse_option(const struct sk_buff *skb, const unsigned char *ptr, } mp_opt->add_addr = 1; + mp_opt->port = 0; mp_opt->addr_id = *ptr++; pr_debug("ADD_ADDR: id=%d", mp_opt->addr_id); if (mp_opt->family == MPTCP_ADDR_IPVERSION_4) { memcpy((u8 *)&mp_opt->addr.s_addr, (u8 *)ptr, 4); ptr += 4; + if (opsize == TCPOLEN_MPTCP_ADD_ADDR_PORT || + opsize == TCPOLEN_MPTCP_ADD_ADDR_BASE_PORT) { + mp_opt->port = get_unaligned_be16(ptr); + ptr += 2; + } } #if IS_ENABLED(CONFIG_MPTCP_IPV6) else { memcpy(mp_opt->addr6.s6_addr, (u8 *)ptr, 16); ptr += 16; + if (opsize == TCPOLEN_MPTCP_ADD_ADDR6_PORT || + opsize == TCPOLEN_MPTCP_ADD_ADDR6_BASE_PORT) { + mp_opt->port = get_unaligned_be16(ptr); + ptr += 2; + } } #endif if (!mp_opt->echo) { -- 2.17.2