diff options
author | Benoit Foucher <benoit@zeroc.com> | 2018-02-07 09:51:18 +0100 |
---|---|---|
committer | Benoit Foucher <benoit@zeroc.com> | 2018-02-07 09:51:18 +0100 |
commit | ec19831c2f76305ee8e259ac0469d615f14b5c3b (patch) | |
tree | f268a065180ca4d7b72b70af2f5f8e06cc940abc /cpp/src/Ice/Network.cpp | |
parent | Added support for ./allTests.py --rlanguages to exclude some language mapping... (diff) | |
download | ice-ec19831c2f76305ee8e259ac0469d615f14b5c3b.tar.bz2 ice-ec19831c2f76305ee8e259ac0469d615f14b5c3b.tar.xz ice-ec19831c2f76305ee8e259ac0469d615f14b5c3b.zip |
Better fix for publishing loopback addresses when no other addresses are available (ICE-8622)
Diffstat (limited to 'cpp/src/Ice/Network.cpp')
-rwxr-xr-x | cpp/src/Ice/Network.cpp | 65 |
1 files changed, 43 insertions, 22 deletions
diff --git a/cpp/src/Ice/Network.cpp b/cpp/src/Ice/Network.cpp index b97c8834bcf..9b1b186d56d 100755 --- a/cpp/src/Ice/Network.cpp +++ b/cpp/src/Ice/Network.cpp @@ -780,6 +780,35 @@ getAddressStorageSize(const Address& addr) return size; } +vector<Address> +getLoopbackAddresses(ProtocolSupport protocol, int port = 0) +{ + vector<Address> result; + + Address addr; + memset(&addr.saStorage, 0, sizeof(sockaddr_storage)); + + // + // We don't use getaddrinfo when host is empty as it's not portable (some old Linux + // versions don't support it). + // + if(protocol != EnableIPv4) + { + addr.saIn6.sin6_family = AF_INET6; + addr.saIn6.sin6_port = htons(port); + addr.saIn6.sin6_addr = in6addr_loopback; + result.push_back(addr); + } + if(protocol != EnableIPv6) + { + addr.saIn.sin_family = AF_INET; + addr.saIn.sin_port = htons(port); + addr.saIn.sin_addr.s_addr = htonl(INADDR_LOOPBACK); + result.push_back(addr); + } + return result; +} + #endif // #ifndef ICE_OS_UWP } @@ -1055,9 +1084,6 @@ IceInternal::getAddresses(const string& host, int port, ProtocolSupport protocol bool preferIPv6, bool canBlock) { vector<Address> result; - Address addr; - - memset(&addr.saStorage, 0, sizeof(sockaddr_storage)); // // We don't use getaddrinfo when host is empty as it's not portable (some old Linux @@ -1065,24 +1091,14 @@ IceInternal::getAddresses(const string& host, int port, ProtocolSupport protocol // if(host.empty()) { - if(protocol != EnableIPv4) - { - addr.saIn6.sin6_family = AF_INET6; - addr.saIn6.sin6_port = htons(port); - addr.saIn6.sin6_addr = in6addr_loopback; - result.push_back(addr); - } - if(protocol != EnableIPv6) - { - addr.saIn.sin_family = AF_INET; - addr.saIn.sin_port = htons(port); - addr.saIn.sin_addr.s_addr = htonl(INADDR_LOOPBACK); - result.push_back(addr); - } + result = getLoopbackAddresses(protocol, port); sortAddresses(result, protocol, selType, preferIPv6); return result; } + Address addr; + memset(&addr.saStorage, 0, sizeof(sockaddr_storage)); + struct addrinfo* info = 0; int retry = 5; @@ -1218,7 +1234,8 @@ IceInternal::getAddressForServer(const string& host, int port, ProtocolSupport p #endif return addr; } - vector<Address> addrs = getAddresses(host, port, protocol, Ice::ICE_ENUM(EndpointSelectionType, Ordered), preferIPv6, canBlock); + vector<Address> addrs = getAddresses(host, port, protocol, Ice::ICE_ENUM(EndpointSelectionType, Ordered), + preferIPv6, canBlock); return addrs.empty() ? Address() : addrs[0]; } @@ -1640,7 +1657,7 @@ IceInternal::getHostsForEndpointExpand(const string& host, ProtocolSupport proto hosts.push_back(wstringToString(h->CanonicalName->Data(), getProcessStringConverter())); } } - if(includeLoopback) + if(hosts.empty() || includeLoopback) { if(protocolSupport != EnableIPv6) { @@ -1686,10 +1703,14 @@ IceInternal::getHostsForEndpointExpand(const string& host, ProtocolSupport proto hosts.push_back(inetAddrToString(*p)); } } - if(hosts.empty() && !includeLoopback) + if(hosts.empty()) { - // Return loopback if only loopback is available no other local addresses are available. - return getHostsForEndpointExpand(host, protocolSupport, true); + // Return loopback if no other local addresses are available. + addrs = getLoopbackAddresses(protocolSupport); + for(vector<Address>::const_iterator p = addrs.begin(); p != addrs.end(); ++p) + { + hosts.push_back(inetAddrToString(*p)); + } } } return hosts; // An empty host list indicates to just use the given host. |