diff --git a/libraries/SocketWrapper/SocketHelpers.h b/libraries/SocketWrapper/SocketHelpers.h index ddf22f1e..cf15fefe 100644 --- a/libraries/SocketWrapper/SocketHelpers.h +++ b/libraries/SocketWrapper/SocketHelpers.h @@ -165,4 +165,4 @@ class NetworkInterface { // TODO: manual functions for setting IP address, subnet mask, gateway, etc. // net_if_ipv4_set_netmask_by_addr(iface, &addr4, &nm); // net_if_ipv4_addr_add(iface, &addr4, NET_ADDR_MANUAL, 0); -}; \ No newline at end of file +}; diff --git a/libraries/SocketWrapper/SocketWrapper.h b/libraries/SocketWrapper/SocketWrapper.h index bb085db7..ad5c36db 100644 --- a/libraries/SocketWrapper/SocketWrapper.h +++ b/libraries/SocketWrapper/SocketWrapper.h @@ -29,6 +29,7 @@ class ZephyrSocketWrapper { // Resolve address struct addrinfo hints; struct addrinfo *res; + bool rv = true; hints.ai_family = AF_INET; hints.ai_socktype = SOCK_STREAM; @@ -47,21 +48,31 @@ class ZephyrSocketWrapper { } if (ret != 0) { - return false; + rv = false; + goto exit; } sock_fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (sock_fd < 0) { - return false; + rv = false; + + goto exit; } if (::connect(sock_fd, res->ai_addr, res->ai_addrlen) < 0) { ::close(sock_fd); sock_fd = -1; - return false; + rv = false; + goto exit; } - return true; + exit: + if(res != nullptr) { + freeaddrinfo(res); + res = nullptr; + } + + return rv; } bool connect(IPAddress host, uint16_t port) { @@ -99,6 +110,13 @@ class ZephyrSocketWrapper { int resolve_attempts = 100; int ret; + bool rv = true; + + sec_tag_t sec_tag_opt[] = { + CA_CERTIFICATE_TAG, + }; + + uint32_t timeo_optval = 100; while (resolve_attempts--) { ret = getaddrinfo(host, String(port).c_str(), &hints, &res); @@ -111,7 +129,8 @@ class ZephyrSocketWrapper { } if (ret != 0) { - return false; + rv = false; + goto exit; } if (ca_certificate_pem != nullptr) { @@ -121,28 +140,32 @@ class ZephyrSocketWrapper { sock_fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TLS_1_2); if (sock_fd < 0) { - return false; + rv = false; + goto exit; } - sec_tag_t sec_tag_opt[] = { - CA_CERTIFICATE_TAG, - }; setsockopt(sock_fd, SOL_TLS, TLS_SEC_TAG_LIST, sec_tag_opt, sizeof(sec_tag_opt)); setsockopt(sock_fd, SOL_TLS, TLS_HOSTNAME, host, strlen(host)); - uint32_t timeo_optval = 100; setsockopt(sock_fd, SOL_SOCKET, SO_RCVTIMEO, &timeo_optval, sizeof(timeo_optval)); if (::connect(sock_fd, res->ai_addr, res->ai_addrlen) < 0) { ::close(sock_fd); sock_fd = -1; - return false; + rv = false; + goto exit; } is_ssl = true; - return true; + exit: + if(res != nullptr) { + freeaddrinfo(res); + res = nullptr; + } + + return rv; } #endif @@ -243,4 +266,4 @@ class ZephyrSocketWrapper { } friend class ZephyrClient; -}; \ No newline at end of file +}; diff --git a/loader/llext_exports.c b/loader/llext_exports.c index a0dc10df..52d214c1 100644 --- a/loader/llext_exports.c +++ b/loader/llext_exports.c @@ -138,6 +138,7 @@ FORCE_EXPORT_SYM(shared_multi_heap_free); #if defined(CONFIG_NET_SOCKETS) FORCE_EXPORT_SYM(getaddrinfo); +FORCE_EXPORT_SYM(freeaddrinfo) FORCE_EXPORT_SYM(socket); FORCE_EXPORT_SYM(connect); FORCE_EXPORT_SYM(send);