summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Powell <petpow@saberuk.com>2019-04-25 19:20:07 +0100
committerPeter Powell <petpow@saberuk.com>2019-04-25 19:24:35 +0100
commitb4599531f97a9e6207b6bb8d728d7523b6995523 (patch)
tree91a7a2aed92a223a5f255f924e6b1b5d084d036d
parentc13d0744fee3b1411d238d45ad66eef8b104f72e (diff)
Fix broken linking over IPv4 on IPv6 capable systems.
If no bind address was specified then one would be created which had an incompatible address family to the address that the server was trying to connect to.
-rw-r--r--src/modules/m_spanningtree/treesocket1.cpp20
1 files changed, 15 insertions, 5 deletions
diff --git a/src/modules/m_spanningtree/treesocket1.cpp b/src/modules/m_spanningtree/treesocket1.cpp
index fd20d04c4..1913fa4de 100644
--- a/src/modules/m_spanningtree/treesocket1.cpp
+++ b/src/modules/m_spanningtree/treesocket1.cpp
@@ -47,12 +47,22 @@ TreeSocket::TreeSocket(Link* link, Autoconnect* myac, const irc::sockets::sockad
irc::sockets::sockaddrs bind;
memset(&bind, 0, sizeof(bind));
- if ((dest.family() == AF_INET || dest.family() == AF_INET6) && !irc::sockets::aptosa(link->Bind, 0, bind))
+ if (!link->Bind.empty() && (dest.family() == AF_INET || dest.family() == AF_INET6))
{
- state = I_ERROR;
- SetError("Bind address '" + link->Bind + "' is not an valid IPv4 or IPv6 address");
- TreeSocket::OnError(I_ERR_BIND);
- return;
+ if (!irc::sockets::aptosa(link->Bind, 0, bind))
+ {
+ state = I_ERROR;
+ SetError("Bind address '" + link->Bind + "' is not an valid IPv4 or IPv6 address");
+ TreeSocket::OnError(I_ERR_BIND);
+ return;
+ }
+ else if (bind.family() != dest.family())
+ {
+ state = I_ERROR;
+ SetError("Bind address '" + bind.addr() + "' is not the same address family as destination address '" + dest.addr() + "'");
+ TreeSocket::OnError(I_ERR_BIND);
+ return;
+ }
}
DoConnect(dest, bind, link->Timeout);