From 6d3e417eaa4a9b81b666f5706999e7e78a9444d2 Mon Sep 17 00:00:00 2001 From: Juha Ylinen Date: Mon, 11 Dec 2017 15:52:42 +0200 Subject: [PATCH 1/3] lwip: fix socket behaviour Return NSAPI_ERROR_PARAMETER when: Binding to a non-local address Socket listen() is called without calling bind() first Socket accept() is called without calling listen() first --- .../FEATURE_LWIP/lwip-interface/lwip_stack.c | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/features/FEATURE_LWIP/lwip-interface/lwip_stack.c b/features/FEATURE_LWIP/lwip-interface/lwip_stack.c index 7325703f5ec..b9b60b37fdc 100644 --- a/features/FEATURE_LWIP/lwip-interface/lwip_stack.c +++ b/features/FEATURE_LWIP/lwip-interface/lwip_stack.c @@ -992,6 +992,32 @@ static nsapi_error_t mbed_lwip_socket_bind(nsapi_stack_t *stack, nsapi_socket_t return NSAPI_ERROR_PARAMETER; } +#if LWIP_IPV6 + if (IP_IS_V6(ip_addr) && !ip6_addr_isany(&ip_addr)) { + const ip_addr_t *local_addr = mbed_lwip_get_ipv6_addr(&lwip_netif); + if (!local_addr) { + return NSAPI_ERROR_PARAMETER; + } + + if (!ip6_addr_cmp(local_addr, &ip_addr)) { + return NSAPI_ERROR_PARAMETER; + } + } +#endif + +#if LWIP_IPV4 + if (IP_IS_V4(ip_addr) && !ip4_addr_isany(&ip_addr)) { + const ip_addr_t *local_addr = mbed_lwip_get_ipv4_addr(&lwip_netif); + if (!local_addr) { + return NSAPI_ERROR_PARAMETER; + } + + if (!ip4_addr_cmp(local_addr, &ip_addr)) { + return NSAPI_ERROR_PARAMETER; + } + } +#endif + err_t err = netconn_bind(s->conn, &ip_addr, port); return mbed_lwip_err_remap(err); } @@ -1000,6 +1026,10 @@ static nsapi_error_t mbed_lwip_socket_listen(nsapi_stack_t *stack, nsapi_socket_ { struct lwip_socket *s = (struct lwip_socket *)handle; + if (s->conn->pcb.tcp->local_port == 0) { + return NSAPI_ERROR_PARAMETER; + } + err_t err = netconn_listen_with_backlog(s->conn, backlog); return mbed_lwip_err_remap(err); } @@ -1028,6 +1058,10 @@ static nsapi_error_t mbed_lwip_socket_accept(nsapi_stack_t *stack, nsapi_socket_ return NSAPI_ERROR_NO_SOCKET; } + if (s->conn->pcb.tcp->state != LISTEN) { + return NSAPI_ERROR_PARAMETER; + } + err_t err = netconn_accept(s->conn, &ns->conn); if (err != ERR_OK) { mbed_lwip_arena_dealloc(ns); From 52353d2ede17c6c9c40bbc724674f4557479906e Mon Sep 17 00:00:00 2001 From: Juha Ylinen Date: Tue, 12 Dec 2017 14:32:21 +0200 Subject: [PATCH 2/3] Add function to check if address is local Update the code to check all addresses for all interfaces. Move the code from mbed_lwip_socket_bind() to a new function called mbed_lwip_is_local_addr() --- .../FEATURE_LWIP/lwip-interface/lwip_stack.c | 57 +++++++++++-------- 1 file changed, 33 insertions(+), 24 deletions(-) diff --git a/features/FEATURE_LWIP/lwip-interface/lwip_stack.c b/features/FEATURE_LWIP/lwip-interface/lwip_stack.c index b9b60b37fdc..8142b5e95cb 100644 --- a/features/FEATURE_LWIP/lwip-interface/lwip_stack.c +++ b/features/FEATURE_LWIP/lwip-interface/lwip_stack.c @@ -275,6 +275,37 @@ static const ip_addr_t *mbed_lwip_get_ipv6_addr(const struct netif *netif) } #endif +static bool mbed_lwip_is_local_addr(const ip_addr_t *ip_addr) +{ + struct netif *netif; + + for (netif = netif_list; netif != NULL; netif = netif->next) { + if (!netif_is_up(netif)) { + continue; + } +#if LWIP_IPV6 + if (IP_IS_V6(ip_addr)) { + for (int i = 0; i < LWIP_IPV6_NUM_ADDRESSES; i++) { + if (ip6_addr_isvalid(netif_ip6_addr_state(netif, i)) && + ip6_addr_cmp(netif_ip6_addr(netif, i), ip_addr)) { + return true; + } + } + } +#endif + +#if LWIP_IPV4 + if (IP_IS_V4(ip_addr)) { + if (!ip4_addr_isany(netif_ip4_addr(netif)) && + ip4_addr_cmp(netif_ip_addr4(netif), ip_addr)) { + return true; + } + } +#endif + } + return false; +} + const ip_addr_t *mbed_lwip_get_ip_addr(bool any_addr, const struct netif *netif) { const ip_addr_t *pref_ip_addr = 0; @@ -992,31 +1023,9 @@ static nsapi_error_t mbed_lwip_socket_bind(nsapi_stack_t *stack, nsapi_socket_t return NSAPI_ERROR_PARAMETER; } -#if LWIP_IPV6 - if (IP_IS_V6(ip_addr) && !ip6_addr_isany(&ip_addr)) { - const ip_addr_t *local_addr = mbed_lwip_get_ipv6_addr(&lwip_netif); - if (!local_addr) { - return NSAPI_ERROR_PARAMETER; - } - - if (!ip6_addr_cmp(local_addr, &ip_addr)) { - return NSAPI_ERROR_PARAMETER; - } - } -#endif - -#if LWIP_IPV4 - if (IP_IS_V4(ip_addr) && !ip4_addr_isany(&ip_addr)) { - const ip_addr_t *local_addr = mbed_lwip_get_ipv4_addr(&lwip_netif); - if (!local_addr) { - return NSAPI_ERROR_PARAMETER; - } - - if (!ip4_addr_cmp(local_addr, &ip_addr)) { - return NSAPI_ERROR_PARAMETER; - } + if (!ip_addr_isany(&ip_addr) && !mbed_lwip_is_local_addr(&ip_addr)) { + return NSAPI_ERROR_PARAMETER; } -#endif err_t err = netconn_bind(s->conn, &ip_addr, port); return mbed_lwip_err_remap(err); From 32e64e7171ed351227da2f14a781b61465ccbe20 Mon Sep 17 00:00:00 2001 From: Juha Ylinen Date: Mon, 18 Dec 2017 16:20:19 +0200 Subject: [PATCH 3/3] Fix build for IPv4+IPv6 config --- features/FEATURE_LWIP/lwip-interface/lwip_stack.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/features/FEATURE_LWIP/lwip-interface/lwip_stack.c b/features/FEATURE_LWIP/lwip-interface/lwip_stack.c index 8142b5e95cb..23ffbc5317c 100644 --- a/features/FEATURE_LWIP/lwip-interface/lwip_stack.c +++ b/features/FEATURE_LWIP/lwip-interface/lwip_stack.c @@ -287,7 +287,7 @@ static bool mbed_lwip_is_local_addr(const ip_addr_t *ip_addr) if (IP_IS_V6(ip_addr)) { for (int i = 0; i < LWIP_IPV6_NUM_ADDRESSES; i++) { if (ip6_addr_isvalid(netif_ip6_addr_state(netif, i)) && - ip6_addr_cmp(netif_ip6_addr(netif, i), ip_addr)) { + ip6_addr_cmp(netif_ip6_addr(netif, i), ip_2_ip6(ip_addr))) { return true; } } @@ -297,7 +297,7 @@ static bool mbed_lwip_is_local_addr(const ip_addr_t *ip_addr) #if LWIP_IPV4 if (IP_IS_V4(ip_addr)) { if (!ip4_addr_isany(netif_ip4_addr(netif)) && - ip4_addr_cmp(netif_ip_addr4(netif), ip_addr)) { + ip4_addr_cmp(netif_ip4_addr(netif), ip_2_ip4(ip_addr))) { return true; } }