From 2ac4fe3befb067ec4cef69784794d056f72ec1fa Mon Sep 17 00:00:00 2001 From: Davide Caratti Date: Mon, 22 Feb 2021 20:36:40 +0100 Subject: [PATCH] fix a couple of bugs found with outbound echo-ed ADD_ADDR - fix segmentation fault in case the endpoint is not found - fix wrong endpoint "guess" when port is not specified Link: https://github.com/multipath-tcp/mptcp_net-next/issues/54 Signed-off-by: Davide Caratti --- gtests/net/packetdrill/mptcp.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/gtests/net/packetdrill/mptcp.c b/gtests/net/packetdrill/mptcp.c index d2a5e47a..3c79a65b 100755 --- a/gtests/net/packetdrill/mptcp.c +++ b/gtests/net/packetdrill/mptcp.c @@ -1879,17 +1879,20 @@ static struct endpoint *find_next_addr_inbound(struct packet *live_packet, struc add_addr_live->length == TCPOLEN_ADD_ADDR_V4_HMAC || add_addr_live->length == TCPOLEN_ADD_ADDR_V6 || add_addr_live->length == TCPOLEN_ADD_ADDR_V6_HMAC){ - endpoint->port = htons(subflow->src_port); + endpoint->port = add_addr_script->data.add_addr.flag_E ? + htons(subflow->dst_port) : htons(subflow->src_port); }else if(add_addr_live->length == TCPOLEN_ADD_ADDR_V4_PORT || add_addr_live->length == TCPOLEN_ADD_ADDR_V4_PORT_HMAC){ if(add_addr_script->data.add_addr.ipv4_w_port.port == UNDEFINED) - endpoint->port = htons(subflow->src_port); + endpoint->port = add_addr_script->data.add_addr.flag_E ? + htons(subflow->dst_port): htons(subflow->src_port); else endpoint->port = add_addr_script->data.add_addr.ipv4_w_port.port; }else if(add_addr_live->length == TCPOLEN_ADD_ADDR_V6_PORT || add_addr_live->length == TCPOLEN_ADD_ADDR_V6_PORT_HMAC){ if(add_addr_script->data.add_addr.ipv6_w_port.port == UNDEFINED) - endpoint->port = htons(subflow->src_port); + endpoint->port = add_addr_script->data.add_addr.flag_E ? + htons(subflow->dst_port) : htons(subflow->src_port); else endpoint->port = add_addr_script->data.add_addr.ipv6_w_port.port; } @@ -1957,6 +1960,9 @@ int mptcp_subtype_add_address(struct packet *packet_to_modify, for(addr = mp_state.packetdrill_addrs; addr; addr = addr->next) if(is_equal_ip(&addr->ip, &endpoint->ip)) break; + if (!addr) + return STATUS_ERR; + add_addr_live->data.add_addr.address_id = addr->addr_id; }