On a 32-bit Arch, our `test_ComboAddress` unit test fails because
`ComboAddress("[::1]:-6")` is considered valid. This is caused by
`stoul()` not throwing for a negative value and returning an `unsigned
long` value using unsigned integer wraparound rules. Since we used to
store the result value in a `signed int` and treat negative values
as if the port was not set, the test failed.
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]!=':')
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;
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;
}