mirror of
https://github.com/oxen-io/lokinet
synced 2023-12-14 06:53:00 +01:00
Uncurse SockAddr's sockaddr* operator
The `const sockaddr*` conversion was returning a pointer to the sockaddr_in6, but with its family set to AF_INET, so the receiving code would have treated interpreting the result as a sockaddr_in pointer -- but it isn't, and trying to get the IPv4 from the mis-reinterpreted sockaddr_in6 fails; this then prevented uvw UDP binding (which uses the sockaddr* operator) from working. This changes it to always leave the family value at the proper value and using the ipv6_is_mapped_ipv4 check to determine when we have (and should return) a pointer to the sockaddr_in rather than the sockaddr_in6. Also fixes toString() to compare the full prefix instead of just bytes 10 and 11.
This commit is contained in:
parent
62fc1bbc48
commit
f8d5e106a0
1 changed files with 5 additions and 9 deletions
|
@ -23,7 +23,9 @@ namespace llarp
|
||||||
SockAddr::init()
|
SockAddr::init()
|
||||||
{
|
{
|
||||||
llarp::Zero(&m_addr, sizeof(m_addr));
|
llarp::Zero(&m_addr, sizeof(m_addr));
|
||||||
|
m_addr.sin6_family = AF_INET6;
|
||||||
llarp::Zero(&m_addr4, sizeof(m_addr4));
|
llarp::Zero(&m_addr4, sizeof(m_addr4));
|
||||||
|
m_addr4.sin_family = AF_INET;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -167,7 +169,8 @@ namespace llarp
|
||||||
|
|
||||||
SockAddr::operator const sockaddr*() const
|
SockAddr::operator const sockaddr*() const
|
||||||
{
|
{
|
||||||
return (sockaddr*)&m_addr;
|
return ipv6_is_mapped_ipv4(m_addr.sin6_addr) ? reinterpret_cast<const sockaddr*>(&m_addr4)
|
||||||
|
: reinterpret_cast<const sockaddr*>(&m_addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
SockAddr::operator const sockaddr_in*() const
|
SockAddr::operator const sockaddr_in*() const
|
||||||
|
@ -264,10 +267,9 @@ namespace llarp
|
||||||
if (isEmpty())
|
if (isEmpty())
|
||||||
return "";
|
return "";
|
||||||
|
|
||||||
const uint8_t* ip6 = m_addr.sin6_addr.s6_addr;
|
|
||||||
std::string str;
|
std::string str;
|
||||||
|
|
||||||
if (ip6[10] == 0xff and ip6[11] == 0xff)
|
if (ipv6_is_mapped_ipv4(m_addr.sin6_addr))
|
||||||
{
|
{
|
||||||
// handle IPv4 mapped addrs
|
// handle IPv4 mapped addrs
|
||||||
constexpr auto MaxIPv4PlusPortStringSize = 22;
|
constexpr auto MaxIPv4PlusPortStringSize = 22;
|
||||||
|
@ -309,8 +311,6 @@ namespace llarp
|
||||||
void
|
void
|
||||||
SockAddr::setIPv4(uint32_t ip)
|
SockAddr::setIPv4(uint32_t ip)
|
||||||
{
|
{
|
||||||
m_addr.sin6_family = AF_INET;
|
|
||||||
|
|
||||||
uint8_t* ip6 = m_addr.sin6_addr.s6_addr;
|
uint8_t* ip6 = m_addr.sin6_addr.s6_addr;
|
||||||
llarp::Zero(ip6, sizeof(m_addr.sin6_addr.s6_addr));
|
llarp::Zero(ip6, sizeof(m_addr.sin6_addr.s6_addr));
|
||||||
|
|
||||||
|
@ -318,15 +318,12 @@ namespace llarp
|
||||||
|
|
||||||
std::memcpy(ip6 + 12, &ip, 4);
|
std::memcpy(ip6 + 12, &ip, 4);
|
||||||
m_addr4.sin_addr.s_addr = ip;
|
m_addr4.sin_addr.s_addr = ip;
|
||||||
m_addr4.sin_family = AF_INET;
|
|
||||||
m_empty = false;
|
m_empty = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
SockAddr::setIPv4(uint8_t a, uint8_t b, uint8_t c, uint8_t d)
|
SockAddr::setIPv4(uint8_t a, uint8_t b, uint8_t c, uint8_t d)
|
||||||
{
|
{
|
||||||
m_addr.sin6_family = AF_INET;
|
|
||||||
|
|
||||||
uint8_t* ip6 = m_addr.sin6_addr.s6_addr;
|
uint8_t* ip6 = m_addr.sin6_addr.s6_addr;
|
||||||
llarp::Zero(ip6, sizeof(m_addr.sin6_addr.s6_addr));
|
llarp::Zero(ip6, sizeof(m_addr.sin6_addr.s6_addr));
|
||||||
|
|
||||||
|
@ -338,7 +335,6 @@ namespace llarp
|
||||||
ip6[15] = d;
|
ip6[15] = d;
|
||||||
const auto ip = ipaddr_ipv4_bits(a, b, c, d);
|
const auto ip = ipaddr_ipv4_bits(a, b, c, d);
|
||||||
m_addr4.sin_addr.s_addr = htonl(ip.h);
|
m_addr4.sin_addr.s_addr = htonl(ip.h);
|
||||||
m_addr4.sin_family = AF_INET;
|
|
||||||
m_empty = false;
|
m_empty = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue