diff --git a/pdns/misc.cc b/pdns/misc.cc index ddfbc7b641bb..8e764f7b264c 100644 --- a/pdns/misc.cc +++ b/pdns/misc.cc @@ -733,7 +733,8 @@ int makeIPv6sockaddr(const std::string& addr, struct sockaddr_in6* ret) if(addr.empty()) return -1; string ourAddr(addr); - int port = -1; + bool portSet = false; + unsigned int port; if(addr[0]=='[') { // [::]:53 style address string::size_type pos = addr.find(']'); if(pos == string::npos || pos + 2 > addr.size() || addr[pos+1]!=':') @@ -741,6 +742,7 @@ int makeIPv6sockaddr(const std::string& addr, struct sockaddr_in6* ret) ourAddr.assign(addr.c_str() + 1, pos-1); try { port = pdns_stou(addr.substr(pos+2)); + portSet = true; } catch(std::out_of_range) { return -1; @@ -766,12 +768,12 @@ int makeIPv6sockaddr(const std::string& addr, struct sockaddr_in6* ret) freeaddrinfo(res); } - if(port > 65535) - // negative ports are found with the pdns_stou above - return -1; + if(portSet) { + if(port > 65535) + return -1; - if(port >= 0) ret->sin6_port = htons(port); + } return 0; }