From fc050b3a09fd652b84b19731e543b91144788e35 Mon Sep 17 00:00:00 2001 From: Jeff Becker Date: Sat, 20 May 2023 18:18:40 -0400 Subject: [PATCH] fix issue #2179 when setting libunbound's upstream dns, we need to not pass in the square braces of an ipv6 address. we also net udp handles have ipv6 address for the local ip. --- llarp/dns/server.cpp | 5 +---- llarp/ev/libuv.cpp | 7 +++++-- llarp/net/sock_addr.cpp | 26 +++++++++++--------------- llarp/net/sock_addr.hpp | 2 +- 4 files changed, 18 insertions(+), 22 deletions(-) diff --git a/llarp/dns/server.cpp b/llarp/dns/server.cpp index ef1c01c03..10ed94476 100644 --- a/llarp/dns/server.cpp +++ b/llarp/dns/server.cpp @@ -177,10 +177,7 @@ namespace llarp::dns void AddUpstreamResolver(const SockAddr& dns) { - std::string str = dns.hostString(); - - if (const auto port = dns.getPort(); port != 53) - fmt::format_to(std::back_inserter(str), "@{}", port); + std::string str = fmt::format("{}@{}", dns.hostString(false), dns.getPort()); if (auto err = ub_ctx_set_fwd(m_ctx, str.c_str())) { diff --git a/llarp/ev/libuv.cpp b/llarp/ev/libuv.cpp index 75e370522..ce9e573ed 100644 --- a/llarp/ev/libuv.cpp +++ b/llarp/ev/libuv.cpp @@ -75,8 +75,11 @@ namespace llarp::uv std::optional LocalAddr() const override { - auto addr = handle->sock(); - return SockAddr{addr.ip, huint16_t{static_cast(addr.port)}}; + if (auto addr = handle->sock(); not addr.ip.empty()) + return SockAddr{addr.ip, huint16_t{static_cast(addr.port)}}; + if (auto addr = handle->sock(); not addr.ip.empty()) + return SockAddr{addr.ip, huint16_t{static_cast(addr.port)}}; + return std::nullopt; } std::optional diff --git a/llarp/net/sock_addr.cpp b/llarp/net/sock_addr.cpp index 8fdf457f1..84ccdc6e1 100644 --- a/llarp/net/sock_addr.cpp +++ b/llarp/net/sock_addr.cpp @@ -290,25 +290,21 @@ namespace llarp } std::string - SockAddr::hostString() const + SockAddr::hostString(bool add_braces) const { - std::string str; - char buf[INET6_ADDRSTRLEN] = {0x0}; + std::array buf{}; if (isIPv4()) { - // handle IPv4 mapped addrs - inet_ntop(AF_INET, &m_addr4.sin_addr.s_addr, buf, sizeof(buf)); - str = buf; + // IPv4 mapped addrs + inet_ntop(AF_INET, &m_addr4.sin_addr.s_addr, buf.data(), buf.size()); + return buf.data(); } - else - { - inet_ntop(AF_INET6, &m_addr.sin6_addr.s6_addr, buf, sizeof(buf)); - str.reserve(std::strlen(buf) + 2); - str.append("["); - str.append(buf); - str.append("]"); - } - return str; + + inet_ntop(AF_INET6, &m_addr.sin6_addr.s6_addr, buf.data(), buf.size()); + if (not add_braces) + return buf.data(); + + return fmt::format("[{}]", buf.data()); } bool diff --git a/llarp/net/sock_addr.hpp b/llarp/net/sock_addr.hpp index 7634c6e23..448a8c6d5 100644 --- a/llarp/net/sock_addr.hpp +++ b/llarp/net/sock_addr.hpp @@ -87,7 +87,7 @@ namespace llarp ToString() const; std::string - hostString() const; + hostString(bool add_braces = true) const; inline int Family() const